简单的python类继承问题

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混淆了,或者类似的愚蠢的东西…

任何帮助都将不胜感激!


为了给类的每个实例提供它自己的字典和名字簿,您需要使用self符号。

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初始化这些类范围变量,然后在整个过程中使用相同的对象。

如果希望字典对每个实例都是唯一的,请在对象构造期间通过实现__init__来分配它。