包含python中列表的类的多个实例

时间:2013-12-09 08:57:42

标签: python list object class-variables

在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']

4 个答案:

答案 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']