简单的Python类继承问题

时间:2012-08-26 04:41:11

标签: python class

  

可能重复:
  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混淆或类似的东西......

非常感谢任何帮助!

3 个答案:

答案 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__来指定它。