为什么类属性中的列表实例化后仍然是类属性,而不是实例属性?

问题描述 投票:0回答:2

我有一个带有属性的类和一个带有空值的列表。当生成a和b的两个实例并向属性添加元素时,发现属性没有实例化。使用id查看a.property和b.property。内存地址是一样的。为什么?

property attribute
怎么能变成
instance attribute

我的代码示例如下:

class MyClass:
    property = []

    def __init__(self):
        pass

    def append(self, value):
        self.property.append(value)


a = MyClass()
b = MyClass()
a.append(1)
print(a.property)
b.append(1)

print(a.property)
print(b.property)

print(id(a.property))
print(id(b.property))

结果是:

[1]
[1, 1]
[1, 1]
1866383694784
1866383694784

我尊重的结果:

[1]
[1]
[1]
python class instance
2个回答
4
投票

在您的情况下,

property = []
是一个类变量,与您的类的所有实例共享。我认为,您不想与其他类分享
property = []
的值。这意味着您需要一个实例变量,可以像下面这样定义它。

class MyClass:
    def __init__(self):
        self.property = []

    def append(self, value):
        self.property.append(value)

这应该会给你预期的输出,纯粹!


0
投票

发生这种情况是因为您没有在

property
函数内声明
__init__

每次创建对象的新实例时都会调用
__init__
,所以我想这就是您正在寻找的。
尝试对您的班级应用以下更改:

class MyClass:
    def __init__(self):
        self.property = []

    def append(self, value):
        self.property.append(value)
© www.soinside.com 2019 - 2024. All rights reserved.