继承
摘要
1 定义
2 使用
3 为什么有继承
4 怎么查看继承的所有父类
5 单继承属性查找顺序
6 多继承属性查找顺
7 super() 与 mro()配合使用
详细
""" 1 定义 类与类中相似的的属性提炼出设定成一个类,这个新类即父类,原来的类叫子类,子类可以调用父类任意属性,这就叫继承 2 使用 class 类名(父类名/即所要继承的类名) 3 为什么有继承 解决类与类之间代码重复性问题 4 怎么查看继承的所有父类 print(类名.__bases__) 5 单继承属性查找顺序 对象名称空间-子类名称空间-父类名称空间 6 多继承属性查找顺序 6.1 画继承图 6.2 确定查找方法 a: python3解释器中 广度优先 b: python2解释器中 新式类: 广度优先 经典类: 深度优先 补充: 新式类:继承了object类的子孙 经典类:没有继承object类的子孙 新式类和经典类只有在python2中区分,python3解释器中只有新式类 6.3 依据查找方法画查找顺序图 6.4 查找 7 super() 与 mro()配合使用 """
1 实例中父类定义方法,及实际使用
class People(): school = 'bj' def __init__(self, name, age): self.name = name self.age = age # self.course = [] class Student(People): # 类Student继承类People def __init__(self, name, age): People.__init__(self, name, age) self.courses = [] def choose_course(self, courses=None): if not courses: print('学生%s没有选择课程' % self.name) else: self.courses.append(courses) print('%s 选课成功%s' % (self.name, self.courses)) # stu1 = Student('TOM', 18) # stu1.choose_course('RUN') # stu1.choose_course('MUSIC') class Teacher(People): # 类Teacher继承父类People def __init__(self, name, age): People.__init__(self, name, age) self.t_course = [] def choose_t_course(self,t_course=None): if not t_course: print('老师没有选择教的课程') else: self.t_course.append(t_course) print('老师%s教%s课' % (self.name, self.t_course)) # t1 = Teacher('jg', 35) # t1.choose_t_course('music')
5 单继承下属性查找顺序
# # 例1 # class Foo: # def f1(self): # print('Foo.f1') # # def f2(self): # # # print('Foo.f2') # self.f1() # # # class Bar(Foo): # def f1(self): # print('Bar.f1') # # # obj = Bar() # {} # obj.f2() # # 例2 # class Foo: # def __f1(self): # _Foo__f1() # print('Foo.f1') # # def f2(self): # # # print('Foo.f2') # self.__f1() # _Foo__f1() # # # class Bar(Foo): # def __f1(self): # # _Bar__f1() # print('Bar.f1') # # # obj = Bar() # {} # obj.
6 多继承下属性查找顺序
例:
class A(object): def test(self): print('from A') class B(A): print('from B') class C(A): print('from C') class D(B): print('from D') class E(C): print('from E') class F(D, E): print('from F') f1 = F() f1.test()
step1:画出继承关系图
step2:确定查找方法
广度优先
step3:画查找顺序图
step4:
根据查找顺序,找见为止
7 super() 与 mro()配合使用
# 案例: class A: def test(self): print('from A.test') super().test() class B: def test(self): print('from B') class C(A, B): pass c = C() c.test() """ 思路: 1 调用C(),产生一个空字典,自动触发类C中__init__,将里边的属性名放到对象c的名称空间. 2 查找名称test 顺序:对象名称空间->子类名称空间->父类名称空间 2.1 根据1,对象名称空间是空字典,无 2.2 查看类C名称空间,也没有 2.3 去类C的父级类中查找,本例C有两个父级,根据多级父级查找顺序 2.3.1 python3中,广度优先,先去类A中找,找见并执行函数 遇到super().属性名() 这时顺序: 1)print(起始类名.mro()) # print(C.mro()) 2)根据print结果从左到右依次找类名,找到第一个未查找的类名绑定给名字super() # 本例中为类名B绑定给super() 3)绑定后,根据 "绑定类名.属性名()" 找后续 """