我正在尝试使用class inheritance
实现项目,其中父类是:
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
用户将选择上面的种子(只有一个),无论是artist
,track
,genre
还是mood
,这就是我初始化所有种子的原因带有None
的参数,保留参数值以在继承级别插入。
继承的class
是:
class playlist(radio):
def __init__(self,user):
radio.__init__(self, artist, track, genre)
让我们在命令行a track seed
说出用户输入,我的脚本最终以全局变量开头:
track = 'karma police'
这样,所有其他属性(artist
,genre
)仍为None
。
当我创建一个实例时,请说:
jeff = playlist('Jeff Smith')
如果未定义genre
和artist
,则会抛出错误,我只需要继承track
属性,如下所示:
radio.__init__(self, track)
我知道我可以使用定义的全局变量启动脚本:
track = None
genre = None
artist = None
这将允许我拥有:
radio.__init__(self, artist, track, genre)
但这在我看来相当多余......
是否有解决方法,不需要将全局变量的初始值设置为None
,将所有代码保留在类范围定义中?
答案 0 :(得分: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
而不会出现任何问题。
答案 1 :(得分:0)
您没有传递这些变量,因此请勿尝试传递它们。父类已经有了默认值,所以只需传递你需要的那个:
radio.__init__(self, artist=artist)