【问题标题】:When I use one base class for two different classes, and change a variable within one class instance, the variable in the other class is also changed?当我将一个基类用于两个不同的类,并在一个类实例中更改一个变量时,另一个类中的变量也会更改吗?
【发布时间】:2021-08-27 21:44:10
【问题描述】:

下面的源代码将在最后一行引发异常。如果它们是两个不同的对象,为什么会引发异常?

class BaseClass(object):
    
    accounts = dict()
    
    def AddAccount(self, account_id, account_var):
        if account_id in self.accounts.keys():
            raise Exception('Account already exists')
            
        self.accounts.update({account_id: account_var})
        
class Class1(BaseClass):
    pass

class Class2(BaseClass):
    pass

ACCOUNT_ID = '123'
c1 = Class1()
c2 = Class2()

c1.AddAccount(ACCOUNT_ID, 'abc')
c2.AddAccount(ACCOUNT_ID, 'abc')

我尝试在每个类中调用构造函数,但这并不能解决问题。我在每个班级都喜欢这样:

def __init__(self):
    super().__init__()

看起来BaseClass 始终是一个静态对象。当我改变一个对象时,它会改变另一个对象。

【问题讨论】:

  • " 总是一个静态对象。当我改变一个对象时,它会改变另一个对象。" 是的,这就是类属性的重点
  • 与其他语言不同,Python 类只定义类属性,从不定义实例属性。实例属性总是通过直接修改实例来创建,尽管这通常是通过实例方法完成的。

标签: python class object inheritance constructor


【解决方案1】:

您已将accounts 定义为类的变量,而不是实例变量。相反,您应该在基类的 __init__ 方法中定义 accounts,以便为您创建的类的每个实例使用不同的引用对其进行实例化。

class BaseClass(object):
    def __init__(self):
        self.accounts = dict()
    
    def AddAccount(self, account_id, account_var):
        if account_id in self.accounts.keys():
            raise Exception('Account already exists')
            
        self.accounts.update({account_id: account_var})

【讨论】:

    【解决方案2】:

    您已经在 BaseClass 的正文中定义了一个类变量。

    即使您使用self.accounts 引用它,它也不是实例变量。

    如果你想要一个实例变量,例如,你应该在 __init__()self.accounts = {} 中初始化它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 2017-08-12
      • 1970-01-01
      • 2020-08-24
      • 2015-06-09
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多