python类属性:意外行为

时间:2013-05-15 16:55:35

标签: python list oop

我只是在python中有一个令人费解的问题。 请考虑以下课程:

class A:
    __lst = []
    def add(self, str):
        self.__lst.append(str)
        print len(self.__lst)

我试图制作两个x和y实例,我得到了这个:

>>> x = A()
>>> x.add('aaa')
1
>>> x.add('bbb')
2
>>> y = A()
>>> y.add('aaa')
3
>>> y.add('bbb')
4

我原本期望y的实例将有一个list属性的单独副本,但即使你使用另一个对象向列表中添加元素,它似乎也会变大。这简直太奇怪了。

有人可以就此事赐教吗? 非常感谢您的帮助。 : - )

2 个答案:

答案 0 :(得分:1)

如果在类体内部定义属性,那么它将是一个类属性,并且它将由所有实例共享。在您的代码self.__lst中将引用A.__lst

要为每个属性设置单独的列表,请在self.__lst函数内将其定义为__init__()

class A(object):
    def __init__(self):
        self.__lst = []

    def add(self, s):
        self.__lst.append(s)
        print len(self.__lst)

除了上面引用的更改之外,我还进行了一些小修改,以便您的代码遵循一些Python最佳实践:继承自objectnew-style class)而不使用str(或任何其他内置名称)作为变量名称。

答案 1 :(得分:0)

在类中声明但不通过self声明的变量是类级属性(如__lst)。它们相当于Java的static。如果您希望您的属性对于所有实例都是唯一的,则需要通过self(即self.__lst)声明它们。