Simple Python class inheritance issue
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Why do attribute references act like this with Python inheritance?
Python: derived classes access dictionary of base class in the same memory location
让我们来看看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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"会编辑其字典!世界跆拳道联盟?我认为"第一"和"第二"是"孩子"类的独立实例。这里发生了什么?为什么您在第二个中编辑的内容会首先影响?
我可以通过在每个孩子的课堂上重新制作书籍来"修复"这个问题,但这不是正确的方法,我想按照他们应该使用的方式来利用课堂。
我做错什么了?
顺便说一句,我的主要语言是cpp,所以我可能把cpp和python混淆了,或者类似的愚蠢的东西…
任何帮助都将不胜感激!
为了给类的每个实例提供它自己的字典和名字簿,您需要使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
输出:
1 2 3 4 5 6 | >>> {'two': 2, 'one': 1} {'two': 2, 'one': 1} {'two': 2, 'one': 1} {'two': 2, 'one': 3} >>> |
您将Book声明为类父级的静态变量。这意味着当加载模块时,变量被初始化。
您希望在创建类时使其初始化,因此需要init方法,该方法是在构造每个实例时自动调用的方法。
您还需要手动调用父init。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
在处理类定义时,python初始化这些类范围变量,然后在整个过程中使用相同的对象。
如果希望字典对每个实例都是唯一的,请在对象构造期间通过实现