2016-12-31 164 views
1

我试图用class inheritance,在父类是实施一个项目:Python类 - 属性继承

class radio: 

    def __init__(self, artist=None, track=None, genre=None): 

     self.artist = artist 
     self.track = track 
     self.genre = genre 

然后创建methods每个attribute(非工作的例子):

def seed_artist(self): 
     results = api.search(q=self.artist, type='artist') 
     return results 

    def seed_track(self): 
     results = api.search(q=self.track, type='track') 
     return results 

    def seed_genre(self): 
     results = api.search(q=self.genre, type='genre') 
     return results 

用户将选择一个以上的种子(只有一个),它是artisttrack,genremood,这就是为什么我初始化所有参数None,将参数值留在继承级别。

继承class是:

class playlist(radio): 

    def __init__(self,user): 
     radio.__init__(self, artist, track, genre) 

可以说,在命令行中track seed用户输入,我的剧本最终开始与一个全局变量:

track = 'karma police' 

这样,所有其他属性(artist,genre)仍为None

,当我创建一个实例,说:

jeff = playlist('Jeff Smith') 

它会抛出一个错误,说genreartist没有定义,我将不得不只继承track属性,就像这样:

radio.__init__(self, track) 

我知道我可以用定义的全局变量来启动脚本:

track = None 
genre = None 
artist = None 

,这将让我有:

radio.__init__(self, artist, track, genre) 

但这似乎对我相当多余的......

有一种解决方法,既没有必要的全局变量的初始值设置为None ,将所有的代码保存在类范围定义中?

+0

我给了以下的答案,但很难说什么了全局变量的另一种方法是,因为你没有显示或甚至描述了你的代码如何从用户输入到创建一个名为'tracks'的全局变量。一种可能性是让“播放列表”也接受“轨道”,“艺术家”等,并让你的输入解析代码以类似于我在答案中所描述的方式传递一个字典。 – BrenBarn

+0

@BrenBarn我已经为你编辑了这个问题,以防你可能想编辑你的答案。 –

回答

1

不是为每个字段使用单独的全局变量,而是为所有字段使用单个字典。然后你可以传递字典作为关键字参数。

也就是说,不是创建一个名为artist的全局变量,而是创建一个名为radio_fields的字典或其他东西。当用户输入他们的查询,设置在该字典的关键:

radio_fields = {} 
... 
# when you get the user's command 
radio_fields['track'] = 'Karma Police' 

现在,您可以拨打radio.__init__(self, **radio_fields)。这将作为参数传递给radio_fields中的任何密钥。如果只有一个,那么只有这一个会被传递,其他人将按照您在定义radio.__init__时定义的默认值。

可能有更好的方法来构建您的整体程序,但根据您在此处显示的内容很难说。例如,目前尚不清楚为什么playlist只接受一个user参数。如果playlist接受radio接受的所有字段参数,它可以将它们传递到radio而没有任何问题。

0

你没有要传递的变量,所以不要试图通过它们。父类已经为他们违约,所以只是通过一个你需要:

radio.__init__(self, artist=artist) 
+0

问题是,他将不得不根据定义的变量编写一堆单独的调用,以及一系列“if”语句来决定使用哪个调用。 – BrenBarn

+0

但我不知道我需要的那个......这是用户的呼叫。 –