为什么属性引用在Python继承中表现得像这样?

以下内容似乎很奇怪。.基本上,somedata属性似乎在从继承的所有类之间共享the_base_class。


class the_base_class:

    somedata = {}

    somedata['was_false_in_base'] = False



class subclassthing(the_base_class):

    def __init__(self):

            print self.somedata



first = subclassthing()

{'was_false_in_base': False}

first.somedata['was_false_in_base'] = True

second = subclassthing()

{'was_false_in_base': True}

>>> del first

>>> del second

>>> third = subclassthing()

{'was_false_in_base': True}

定义self.somedata的__init__功能显然是要解决这个问题(所以每个类都有它自己的正确方法somedata字典) -但如果是这样的行为可取?


陪伴而非守候
浏览 388回答 3
3回答

慕尼黑8549860

请注意,您看到的部分行为是由somedataa 引起的dict,而不是像a这样的简单数据类型bool。例如,请参见以下示例,该示例的行为有所不同(尽管非常相似):class the_base_class:    somedata = Falseclass subclassthing(the_base_class):    def __init__(self):        print self.somedata>>> first = subclassthing()False>>> first.somedata = True>>> print first.somedataTrue>>> second = subclassthing()False>>> print first.somedataTrue>>> del first>>> del second>>> third = subclassthing()False该示例的行为与问题中给出的示例不同的原因是,在此示例中first.somedata它被赋予了新值(object True),而在第一个示例中,由first.somedata(以及其他子类实例)引用的dict对象也被修改。有关进一步的说明,请参见Torsten Marek对这个答案的评论。

幕布斯7119047

我认为最简单的理解方法(以便您可以预测行为)是认识到您somedata是该类的一个属性,而不是该类的实例(如果以这种方式定义)。实际上somedata在任何时候都只有一个,因为在您的示例中,您没有分配给该名称,而是使用它来查找字典,然后为其分配一个项(键,值)。这是Python解释器如何工作的结果,一开始可能会造成混淆。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python