修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?
来源:9-13 没有什么是不能访问
浅若丶清风
2017-10-14
class Person(): address = '北京' def __init__(self, name): self.name = name p1 = Person('Bob') p2 = Person('Alice') print('Person.address = ' + Person.address) p1.address = '上海' print('p1.address = ' + p1.address) print('Person.address = ' + Person.address ) print('p2.address = ' + p2.address)
结果如下:
Person.address = 北京
p1.address = 上海
Person.address = 北京
p2.address = 北京
在设置了 p1.address = '上海' 后,p1访问 address 确实变成了 '上海',但是,Person.address和p2.address仍然是'北京',怎么回事?
3回答
-
p1.address 设置得是实例属性并不是类属性。python是动态语言,可以这样动态设置。
112017-10-15 -
jaymie
2017-10-15
你可以这样去看
首先 实例化两个Person
p1 = Person('Bob')
p2 = Person('Alice')
然后你去查 p1.__dict__
应该只能得到 {'name': 'Bob'}
然后进行p1.address = ‘上海’
再去查 p1.__dict__
这时候可以得到 {'name': 'Bob', 'address': '上海'}
也就是说 p1.address = ‘上海 这个操作使得p1这个实例新增了一个实例属性p1
而这时候去查p2.__dict__,他是只有{'name': 'Alice'}的
但是你却可以访问到 p2.address,那是因为python属性获取是从下到上获取的,先会去找是否存在一个叫做address的实例属性,如果找不到,再去找是否存在一个叫做address的类属性,如果再找不到就去找他的父类,依次向上。
40 -
SapereAudor
2017-10-15
在实例变量上修改类属性如果变量当时不存在相当追加。类的属性还是存在的,而且不变,如果想Person.address打印出上海,可以通过Person.address进行类变量的赋值。
112017-10-15
相似问题