标签:变量 col img course 完全 内存地址 二层 广度 gif
一、类是一系列对象相同的特征(变量)与技能(函数)的结合体,即类体中最常见的就是变量与函数的定义
但其实类体中是可以存在任意python代码的
类体代码会在定义阶段立即执行,会产生一个类名称空间,用来将类体代码执行过程中产生的名字都丢进去
类的作用主要有两点:
1.当做名称空间从其内部取出名字来使用
2.用来产生对象
二、绑定方法
类中定义的变量是类的数据属性,类可以用,对象也可以用,大家都指向同一个内存地址,类变量值一旦改变,所有对象都跟着变
类中定义的函数时类的函数属性,类可以用,类来调用就是一个普通的函数,但其实类中定义的函数是给对象用的,而且是绑定给对象用的
三、继承
继承是一种新建类的方式,新建的类称之为子类或派生类,被继承的类称之为父类/基类/超类
python中继承的特点:
1.子类可以重用父类属性
2.python中一个子类可以同时继承多个父类
3.目前分为两种类
新式类:但凡继承了object的类,以及该类的子类,都是新式类,在python3中一个类即使是没有显式的继承任何类,默认就会继承object类
经典类:没有继承object的类,以及该类的子类..都是经典类。在python2中才区分新式类与经典类。python2中一个类如果没有显式地继承任何类,也不会继承object类
继承的作用:减少代码冗余
在子类派生出的新方法中重用父类功能的方式一:指名道姓地引用某一个类中的函数
class OldPeople: school=‘oldboy‘ def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class OldboyStudent(OldPeople): def __init__(self,name,age,sex,score=0): OldPeople.__init__(self,name,age,sex) self.score=score def choose_course(self): print(‘%s choosing course‘%self.name) stu1=OldboyStudent(‘刘二蛋‘,38,‘male‘) print(stu1.__dict__)
在子类派生出的新方法中重用父类功能的方式二:super()
super继承的顺序是参照mro表
# 在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用 # 在python2中:super(自己的类名,自己的对象) # 在python3中:super() # 调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!! # 总结: # 1. 严格依赖继承的mro列表 # 2. 访问是绑定方法,有自动传值的效果 class OldboyPeople: school = ‘oldboy‘ def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): def __init__(self, name, age, sex, score=0): super(OldboyStudent, self).__init__(name, age, sex) self.score = score def choose_course(self): print(‘%s choosing course‘ % self.name) class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level=1): super().__init__(name,age,sex) self.level=level stu1=OldboyStudent(‘刘二蛋‘,38,‘male‘) print(stu1.__dict__) tea1=OldboyTeacher(‘egon‘,18,‘male‘,10) print(tea1.__dict__)
四、在单继承背景下属性查找
优先级:对象----对象的类-------父类--------父类
class Foo: x=444 class Bar1(Foo): # x=333 pass class Bar2(Bar1): # x=222 pass lqz=Bar2() print(lqz.x)
五、在多继承背景下属性查找
1.如果一个子类继承多个分支(多个分支没有共同继承一个非object类)
此时属性的查找优先级是:对象-->对象的类-->按照从左往右的顺序一个分支一个分支的查找下去
# 第四层: class G: # x = ‘G‘ pass # 第三层 class E(G): x = ‘E‘ pass class F: # x = ‘F‘ pass # 第二层 class B(E): # x = ‘B‘ pass class C(F): x = ‘C‘ pass class D: x = ‘D‘ pass # 第一层 class A(B, C, D): # x = ‘A‘ pass obj = A() # obj.x = 111 print(obj.x) print(A.mro())
2.菱形继承问题
新式类:广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
经典类:深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类
# 第四层: class G(object): # x = ‘G‘ pass # 第三层 class E(G): # x = ‘E‘ pass class F(G): # x = ‘F‘ pass # 第二层 class B(E): # x = ‘B‘ pass class C(F): # x = ‘C‘ pass class D(G): # x = ‘D‘ pass # 第一层 class A(B, C, D): x = ‘A‘ pass obj=A() # obj.x=111 print(obj.x) print(A.mro())
3.python专门为新式类内置了一个mro的方法,用来查看c3算法,也就是属性查找顺序
print(A.mro())
标签:变量 col img course 完全 内存地址 二层 广度 gif
原文地址:https://www.cnblogs.com/xufengnian/p/10562022.html