为什么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)
找到原因了。 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)