【问题标题】:Python class - attribute inheritancePython 类 - 属性继承
【发布时间】:2017-01-01 11:35:31
【问题描述】:

我正在尝试使用class inheritance 实现一个项目,其中父类是:

class radio:

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

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

然后我为每个attribute 创建methods(非工作示例):

    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

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

继承的class是:

class playlist(radio):

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

假设用户在命令行输入track seed,我的脚本最终以全局变量开始:

track = 'karma police'

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

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

jeff = playlist('Jeff Smith')

它会抛出一个错误,说 genreartist 没有定义,我只需要继承 trackattribute,就像这样:

radio.__init__(self, track)

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

track = None
genre = None
artist = None

这将使我拥有:

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

但这在我看来是多余的......

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

【问题讨论】:

  • 我在下面给出了答案,但很难说全局变量的替代方案是什么,因为您没有展示甚至描述您的代码如何从用户输入到创建一个名为的全局变量tracks。一种可能性是让playlist 也接受trackartist 等,并让您的输入解析代码以类似于我在回答中描述的方式将字典传递给它。
  • @BrenBarn 我已经为你编辑了问题,以防你想编辑你的答案。

标签: python class inheritance


【解决方案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

【讨论】:

    【解决方案2】:

    您没有要传递的变量,所以不要尝试传递它们。父类已经有它们的默认值,所以只需传递你需要的:

    radio.__init__(self, artist=artist)
    

    【讨论】:

    • 问题是他必须根据定义的变量编写一堆单独的调用,以及一堆if 语句来决定使用哪个调用。
    • 但我不知道我需要那个...这是用户的电话。
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 2012-07-25
    • 2015-03-27
    • 1970-01-01
    • 2011-01-30
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多