当我为两个不同的类使用一个基类,并更改一个类实例中的变量时,另一个类中的变量也会更改



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

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始终是一个静态对象。当我改变一个对象时,它也会改变另一个对象。

您已将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})

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

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

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

最新更新