下面的内容看起来很奇怪。基本上,从the_base_class
继承的所有类似乎都共享somedata属性。
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}
在__init__
函数中定义self.somedata
显然是解决这个问题的正确方法(所以每个类都有自己的somedata
字典)--但是什么时候需要这样的行为呢?
发布于 2008-10-15 22:40:10
请注意,您看到的行为的一部分原因是somedata
是一个dict
,而不是一个简单的数据类型,比如bool
。
例如,看看这个不同的示例,它的行为不同(尽管非常相似):
class the_base_class:
somedata = False
class subclassthing(the_base_class):
def __init__(self):
print self.somedata
>>> first = subclassthing()
False
>>> first.somedata = True
>>> print first.somedata
True
>>> second = subclassthing()
False
>>> print first.somedata
True
>>> del first
>>> del second
>>> third = subclassthing()
False
此示例与问题中给出的示例行为不同的原因是,这里first.somedata
被赋予了一个新值(对象True
),而在第一个示例中,由first.somedata
(以及其他子类实例)引用的dict对象正在被修改。
请参阅Torsten Marek对此答案的评论以进一步澄清。
发布于 2008-10-15 22:55:23
我认为理解这一点的最简单方法(以便您可以预测行为)是认识到您的somedata
是类的属性,而不是该类的实例(如果您这样定义它的话)。
在任何时候,实际上只有一个somedata
,因为在您的示例中,您没有为该名称赋值,而是使用它来查找字典,然后为其赋值。这是一个陷阱,这是python解释器工作方式的结果,一开始可能会让人感到困惑。
https://stackoverflow.com/questions/206734
复制相似问题