为什么class属性中的list实例化后还是class属性,不是实例属性?

Why is the list in the class attribute still a class attribute after instantiation, not an instance attribute?

找到原因了。 Python变量,list, dict, set是可变对象,str, tuple string int float bool是不可变对象,所以当修改class属性的list、dict、set时,对应的不会产生。只有对实例属性的list、dict、set进行重新赋值,才会生成实例属性的实例属性。给实例属性str和元组赋值string int float bool会将属性名从class属性复制到实例属性,然后重新赋值

如果我想让class属性列表和实例属性不同,可以同时初始化class属性和实例属性:

class MyClass:
     property = []

     def __init__(self):
         self.property = []
         pass

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


a = MyClass()

print(id(a.property))
print(id(a.__class__.property))

2352192165696
2352189676480

以下是我的原题:

我有一个 class 和一个 属性 以及一个空值列表。当生成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]

在你的例子中 property = [] 是一个 class 变量,它与你的 class 的所有实例共享。我假设您不想与其他 class 共享 property = [] 的值。这意味着你需要一个实例变量,它可以像下面这样定义。

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

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

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

这是因为您没有在 __init__ 函数中声明 property
每次创建对象的新实例时都会调用 __init__,所以我想这就是您要查找的内容。
尝试将以下更改应用到您的 class:

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

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