可能重复:
Why do attribute references act like this with Python inheritance?
Python: derived classes access dictionary of base class in the same memory location
让我们拿代码:
class parent:
book = {'one':1, 'two':2}
class child(parent):
pass
first = child()
second = child()
print first.book
print second.book
second.book['one'] = 3
print first.book
print second.book
当你运行这个对象'first'时,它的字典被编辑了! WTF?我认为'第一'和'第二'是'儿童'课程的独立实例。这里发生了什么?为什么第二次编辑的内容会先影响?
我可以通过在每个子类中重新创建书籍来“修复”这个问题,但这不是正确的方法,我希望按照它们的使用方式来使用类。
我做错了什么?
顺便说一句,我的主要语言是cpp,所以也许我会把cpp与python混淆或类似的东西......
非常感谢任何帮助!
答案 0 :(得分:2)
您将book声明为类父类的静态变量。这意味着在加载模块时该变量是初始化的。
您希望在创建类时使其初始化,因此您需要 init 方法,这是一种在构造每个实例时自动调用的方法。
您还需要手动调用父 init 。
class parent:
def __init__(self):
self.book = {'one':1, 'two':2}
class child(parent):
def __init__(self):
parent.__init__(self)
first = child()
second = child()
print first.book
print second.book
second.book['one'] = 3
print first.book
print second.book
答案 1 :(得分:2)
要为类的每个实例提供它自己的字典和名称簿,您需要使用self
表示法。
class parent:
def __init__(self):
self.book = {'one':1, 'two':2}
class child(parent):
pass
first = child()
second = child()
print first.book
print second.book
second.book['one'] = 3
print first.book
print second.book
输出:
>>>
{'two': 2, 'one': 1}
{'two': 2, 'one': 1}
{'two': 2, 'one': 1}
{'two': 2, 'one': 3}
>>>
答案 2 :(得分:1)
Python在处理类定义时初始化那些类范围变量,然后在整个过程中使用相同的对象。
如果您希望字典对每个实例都是唯一的,请在对象构建期间通过实现__init__
来指定它。