属性的查找顺序与类属性的修改

一:对象属性的查找顺序
class Student:
    school = 'oldboy'
    def choose_course(self):
        print(self.school)
        print('选课技能')
        
定义了两个不同的新对象
s1 = Student()
s2 = Student()

下面打印出来的都是oldboy,因为s1对象和s2对象的名称空间中都没有oldboy属性,共用类的名称空间中的oldboy属性
print(s1.school)
print(s2.school)

s1转学去了北大
s1.school = '北大'

对象自己有属性,优先用自己的,没有才用类的
先从对象自己的名称空间找,没有则取类的名称空间中找,如果类的名称空间没有则报错
print(s1.school)  输出结果: 北大
print(s2.school)  输出结果: oldboy
print(Student.school)  输出结果: oldboy



s1.school = '北大'
s2.school = '清华'

image

二:对象属性/方法的查找顺序
对象调用方法,使用的就是类中定义的方法
类中定义的方法,是绑定给对象的,对象来调用
s1.choose_course() 
s1.choose_course()

对象属性的查找顺序: 对象自己--》类中--》报错
对象方法的查找顺序: 所有对象都用类的方法-》方法有self参数,通过self参数区分是那个对象调用的
类名:__dict__  类的名称空间
对象:__dict__  对象的名称空间
 
所有类中的属性应该写对象共有的属性,如果是对象自己,需要放到对象自己名称空间
三:类属性修改
class Student:
    school = 'oldboy'
    def choose_course(self):
        print(self.school)
        print('选课技能')
       
修改类的属性
Student.school = '北大'

s1 = Student()
s2 = Student()
print(s1.school)  输出结果:北大
print(s2.school)  输出结果:北大
    
 只修改s1名称空间中的属性
s1.school = '清华'
print(s1.school)  输出结果: 清华
print(s2.school)  输出结果: 北大
    
    
结论:
 类中定义属性,对象只能使用,不能修改
对象如果修改,改的是自己的名称空间
四:统计类被实例化次数
class Student:
    count = 0
    
方法1
结论:方法不可用
s1 = Student()
s1 = conut += 1 被实例化一次 数字+1
s2 = Student()
s2 = conut += 1 被实例化一次 数字+1
print(Student.count) 输出结果:永远为0
	因为对象增加的是自己名称空间中的数字
    print(s1.count) 输出结果: 1

方法2
s1 = Student()
Student.count += 1  被实例化一次 数字+1
s2 = Student()
Student,count += 1 被实例化一次 数字+1
类的属性里面增加数字

对象名称空间+1
s1.count += 1

实例化次数
print(Student.count)  输出结果: 2
 s1.count自身名称空间没有count 到类中找到是2 再加上本身名称空间1 从上往下
print(s1.count)  输出结果: 3

image

posted @ 2021-12-05 20:43  AlexEvans  阅读(35)  评论(0编辑  收藏  举报