0

我只是对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 的实例将具有列表属性的单独副本,但似乎即使您使用另一个对象将元素添加到列表中,列表也会变得更大。这很奇怪。

有人可以请教我这个问题吗?非常感谢您的帮助。:-)

4

2 回答 2

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 最佳实践:继承自object( new-style class ) 并且不使用str(或任何其他内置名称)作为变量名。

于 2013-05-15T16:58:07.830 回答
0

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

于 2013-05-15T16:59:43.377 回答