Python类 - 属性继承

时间:2016-12-31 18:53:40

标签: python class inheritance

我正在尝试使用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

用户将选择上面的种子(只有一个),无论是artisttrackgenre还是mood,这就是我初始化所有种子的原因带有None的参数,保留参数值以在继承级别插入。

继承的class是:

class playlist(radio):

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

让我们在命令行a track seed说出用户输入,我的脚本最终以全局变量开头:

track = 'karma police'

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

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

jeff = playlist('Jeff Smith')

如果未定义genreartist,则会抛出错误,我只需要继承track属性,如下所示:

radio.__init__(self, track)

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

track = None
genre = None
artist = None

这将允许我拥有:

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

但这在我看来相当多余......

是否有解决方法,不需要将全局变量的初始值设置为None,将所有代码保留在类范围定义中?

2 个答案:

答案 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)