一:对象属性的查找顺序
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](https://img2020.cnblogs.com/blog/2608805/202112/2608805-20211205204254046-1568739503.webp)
二:对象属性/方法的查找顺序
对象调用方法,使用的就是类中定义的方法
类中定义的方法,是绑定给对象的,对象来调用
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](https://img2020.cnblogs.com/blog/2608805/202112/2608805-20211205204244708-1344870903.webp)