请教各位一个问题!
Topic source文章中有句话你要仔细看:
当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。
count = []
创建了一个空 list
,并用 count
指向它。
也就是 Student.count
和 self.count
都指向了同一个对象。
所以 self.count.append(1)
和 Student.count.append(1)
是完全一样的。
如果你对此有怀疑的话,可以写个程序验证下二者的 id
是否一致:
class Student(object):
count = []
def __init__(self, name):
self.name = name
self.count.append(1)
bart = Student('Bart')
bart1 = Student('Bart1')
bart2 = Student('Bart2')
print(id(Student.count))
print(id(bart.count))
print(id(bart1.count))
print(id(bart2.count))
# 全部是一样的值
补充:
实例属性若想把将类属性「纳为己有」,可以复制一份类属性,比如 self.count = list(Student.count)
。
更多关于复制的内容可以参考 Python 内置的 copy
模块,尤其是 copy.deepcopy
方法。
首先谢谢你们的回复! 如果把count指向空list[] : print(id(Student.count)) print(id(bart.count)) print(id(bart1.count)) print(id(bart2.count)) 打印出来的ID 确实一致。(包括使用二楼兄弟所说的方法: 讲self.count.append(1)改成self.count=self.count+[1])
但是改成原来的 count = 0 ,函数中使用self.count += 1 , 我的打印结果是这样: 1457417664 #id(Student.count) 1457417696 #三个不同实例的ID 一致 1457417696 # 1457417696 # 那么汽水大佬的这段话: “count = [] 创建了一个空 list,并用 count 指向它。 也就是 Student.count 和 self.count 都指向了同一个对象。 所以 self.count.append(1) 和 Student.count.append(1) 是完全一样的。” 是否不能套用在count = 0 的情况上呢? Student.count 和 self.count 无法都指向 count 所指向的 int:0么? 感觉自己被绕进去了T T
- 1
Pmz丶
class Student(object): count = 0 def init(self, name): self.name = name self.count += 1
如果用self.count 而不用Student.count时: 类属性count不会因为实例的增加而增加。 永远都是最初定义的值:0。 由此得出 结论1:类属性不会因为实例自身的属性改变而改变? 但是, 如果这么写: class Student(object): count = [] #定义为一个空列表
#开始测试 bart = Student('Bart') print(Student.count)
bart1 = Student('Bart1') print(Student.count)
bart2 = Student('Bart2') print(Student.count)
输出结果: [1] [1, 1] [1, 1, 1] [Finished in 0.2s]
这里我尝试过,在初始化函数中无论用self.count,还是Student.count 打印结果相同。 这违背了结论1 百思不得其解,求大神解释一下,谢谢了!