【问题标题】:Simple Python class inheritance issue [duplicate]简单的Python类继承问题[重复]
【发布时间】:2012-08-26 04:41:10
【问题描述】:

可能重复:
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

当您运行此对象时,“首先”已编辑其字典!怎么回事?我认为“第一”和“第二”是“孩子”类的独立实例。这里发生了什么?为什么你第二次编辑的内容首先影响?

我可以通过在每个子类中重新创建书籍来“解决”这个问题,但这不是正确的方法,我想按照它们的使用方式来使用类。

我做错了什么?

顺便说一句,我的主要语言是 cpp,所以也许我将 cpp 与 python 或类似的东西混淆了......

任何帮助将不胜感激!

【问题讨论】:

  • 查看我对重复问题的回答:我认为它解释了您要查找的内容。
  • 谢谢大家!我阅读了回复,并相应地更改了我的代码。还在学习python...非常感谢!

标签: python class


【解决方案1】:

您将 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

【讨论】:

  • 感谢包含子构造函数。我看到你必须明确声明你想用它的父母的 init 来初始化孩子。修复了我的错误!
  • 你不需要显式调用孩子的构造函数,不。它将像所有属性一样被继承。
  • @kindall:我想我应该更清楚。在这种情况下,您不需要,但通常您需要调用子构造函数,因为您想提供它的覆盖定义,并且我指出它不会像大多数情况一样自动调用构造函数其他语言
【解决方案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}
>>> 

【讨论】:

    【解决方案3】:

    Python 在处理类定义时会初始化这些类范围变量,然后始终使用相同的对象。

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

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2023-03-22
      • 2016-07-19
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多