我只是在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属性的单独副本,但即使你使用另一个对象向列表中添加元素,它似乎也会变大。这简直太奇怪了。
有人可以就此事赐教吗? 非常感谢您的帮助。 : - )答案 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最佳实践:继承自object
(new-style class)而不使用str
(或任何其他内置名称)作为变量名称。
答案 1 :(得分:0)
在类中声明但不通过self
声明的变量是类级属性(如__lst
)。它们相当于Java的static
。如果您希望您的属性对于所有实例都是唯一的,则需要通过self
(即self.__lst
)声明它们。