在python中运行以下代码时,我创建了一个类的2个对象,其中包含一个列表对象:
class Test():
def run(self):
obj1 = klasse("Werner")
obj2 = klasse("Franz")
print obj1.name
print obj2.name
obj2.add_name("Thomas")
print obj2.name
class klasse(object):
name = [];
def __init__(self, value):
self.name.append(str(value))
def add_name(self, value):
self.name.append(str(value))
if __name__ == "__main__":
Test().run()
在控制台中返回:
['Werner', 'Franz']
['Werner', 'Franz']
['Werner', 'Franz', 'Thomas']
问题:它似乎是两个创建的klasse.objects中的相同列表对象。什么是在每个创建的对象中隔离名称列表的解决方案?
控制台输出应为:
['Werner']
['Franz']
['Franz', 'Thomas']
答案 0 :(得分:2)
klasse
的实施应如下所示:
class klasse(object):
# name = [] if this was the case, the name would be a class variable,
# and all instances would share it
def __init__(self, value):
self.name = [] # but now it is a separate for each instance
self.add_name(value)
def add_name(self, value):
self.name.append(str(value))
编辑:纳入@Jon Clements的建议。
答案 1 :(得分:1)
我刚刚在几个小时前遇到过这个问题。
由于注释表明何时在类中定义变量但在类的方法之外,这是类级变量。类级变量等同于其他语言中的静态变量。只存在该类的所有实例共享的变量的一个副本。有趣的是,当没有类的实例时,变量也存在。使用现有代码库,尝试print klasse.name
。
如果在类的方法中定义变量,则该变量对定义它的类的实例是唯一的。要获得所需的效果,您需要在self.name
方法中创建并初始化__init__
。这将在类的每个实例中创建一个唯一的变量实例。
一方面注意,在python和大多数其他OO语言中,最好的做法是将类名称大写。
答案 2 :(得分:1)
如果你不在self.
前面,变量将是一个类变量,而不是一个实例变量,这意味着每个对象的值都是相同的。对于这种情况,要使name
成为实例变量,您将执行以下操作:
self.name = []
如果您的测试中不明显,则无法在函数外声明self.myVariable
。
答案 3 :(得分:0)
在类Klasse中,name变量是类级变量,因此在创建该类的新实例之前,首先检查名称列表是否为空。如果不为空,则在 init ()中将其设为空,因为此函数会调用每个正在创建的类的实例。
>>> class klasse(object):
... name = []
... def __init__(self, value):
... if self.name:
... self.name = []
... self.name = [value]
... def add_name(self, value):
... self.name.append(str(value))
...
>>> class Test():
... def run(self):
... obj1 = klasse("Werner")
... obj2 = klasse("Franz")
...
... print obj1.name
... print obj2.name
... obj2.add_name("Thomas")
... print obj2.name
...
>>> Test().run()
['Werner']
['Franz']
['Franz', 'Thomas']