修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?

来源: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回答

7七月

2017-10-15

p1.address 设置得是实例属性并不是类属性。python是动态语言,可以这样动态设置。

1
1
浅若丶清风
非常感谢!
2017-10-15
共1条回复

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的类属性,如果再找不到就去找他的父类,依次向上。





4
0

SapereAudor

2017-10-15

在实例变量上修改类属性如果变量当时不存在相当追加。类的属性还是存在的,而且不变,如果想Person.address打印出上海,可以通过Person.address进行类变量的赋值。


1
1
浅若丶清风
明白 谢谢
2017-10-15
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程