今日内容:继承
继承介绍
继承与抽象
属性查找
继承的实现原理
菱形问题
继承原理
深度优先和广度优先
python Mixins机制
# 继承
'''
# 1 什么是继承
# 继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为
# 父类、基类、超类
#
# python支持多继承
#
# 2 为何要继承
# 子类会遗传父类的属性,所以继承是用来解决类与类之间代码冗余问题
#
# 3、如何实现继承
# class Parent1:
# pass
#
# class Parent2:
# pass
#
# class Sub1(Parent1):
# pass
#
# class Sub2(Parent1,Parent2):
# pass
#
# print(Sub1.__bases__)
# print(Sub2.__bases__)
#
# 继承案列:
# class OldboyPeople:
# school = "oldboy"
#
# class Student(OldboyPeople):
# def __init__(self,name,age,gender,stud_id,course):
# self.name = name
# self.age = age
# self.gender = gender
# self.stu_id = stud_id
# self.course = course
#
# def choose(self):
# print('%s 正在选课' %self.name)
#
# class Teacher(OldboyPeople):
# def __init__(self,name,age,gender,salary,level):
# self.name = name
# self.age = age
# self.gender = gender
# self.salary = salary
# self.level = level
#
# def score(self,stu,num):
# stu.num = num
#
# stu1=Student("艾利克斯",73,'male',1001,"python全栈开发")
# tea1=Teacher("egon",18,'male',2000,10)
# print(stu1.school)
# 在子类派生的新方法中重用父类的功能
# 方式一:指名道姓地调用某一个类的函数
# 特点:不依赖于继承关系
# class OldboyPeople:
# school = "oldboy"
# def __init__(self,name,age,gender):
# self.name = name
# self.age = age
# self.gender = gender
#
# def f1(self):
# print('1111111')
#
# class Student(OldboyPeople):
# def __init__(self,name,age,gender,stu_id,course):
# OldboyPeople.__init__(self,name,age,gender) # OldboyPeople.__init__(空对象,"艾利克斯",73,'male')
# self.stu_id = stu_id
# self.course = course
#
# def choose(self):
# print('%s 正在选课' %self.name)
#
# def f1(self):
# OldboyPeople.f1(self)
# print("22222")
#
# class Teacher(OldboyPeople):
# def score(self,stu,num):
# stu.num = num
#
# stu1=Student("艾利克斯",73,'male',1001,"python全栈开发")
# # tea1=Teacher("egon",18,'male',2000,10)
# stu1.f1()
'''
# 属性查找
'''
# class Foo:
# def f2(self):
# print("Foo.f2")
#
# def f1(self):
# print('Foo.f1')
# self.f2() # obj.f2()
#
#
# class Bar(Foo):
# def f2(self):
# print("Bar.f2")
#
#
# obj = Bar()
# obj.f1() # Foo.f1 Bar.f2
#
#
# # 例2:父类如果不想让子类覆盖自己的方法,可以在方法名前加前缀__
# class Foo:
# def __f2(self): # _Foo__f2
# print("Foo.f2")
#
# def f1(self):
# print('Foo.f1')
# self.__f2() # obj._Foo__f2()
#
#
# class Bar(Foo):
# def __f2(self): # _Bar__f2
# print("Bar.f2")
#
#
# obj = Bar()
# obj.f1() # Foo.f1 Foo.f2
'''
# 继承的实现原理
'''
# 1 补充知识:
# 新式类:但凡是继承了object类的子类,以该子类子子孙孙类都称之为新式类
# 经典类:没有继承了object类的子类,以该子类子子孙孙类都称之为经典类
# python3中全都是新式类,python2中才有经典类:
# 在python3中没有继承任何类的类会默认继承object类
# class Foo(object):
# pass
#
# print(Foo.__bases__)
# 2 继承的实现原理
# 2.1 菱形问题:一个子类继承的多条件分支最终汇聚到一个非object类,在菱形继承下
# 新式类与经典类关于属性查找的方式不同
# 新式类:广度优先
# 经典类:深度优先
# 例1:非菱形继承,经典类与新式类的属性查找顺序都一样
# class E:
# # def test(self):
# # print('from E')
# pass
#
# class F:
# def test(self):
# print('from F')
#
# class B(E):
# # def test(self):
# # print('from B')
# pass
#
# class C(F):
# def test(self):
# print('from C')
#
# class D:
# def test(self):
# print('from D')
#
# class A(B, C, D):
# # def test(self):
# # print('from A')
# pass
#
# obj = A()
# obj.test()
# 例2:菱形继承
# class G(object): # 在python2中,未继承object的类及其子类,都是经典类
# # def test(self):
# # print('from G')
# pass
#
# class E(G):
# # def test(self):
# # print('from E')
# pass
#
# class F(G):
# # def test(self):
# # print('from F')
# pass
#
# class B(E):
# # def test(self):
# # print('from B')
# pass
#
# class C(F):
# # def test(self):
# # print('from C')
# pass
#
# class D(G):
# # def test(self):
# # print('from D')
# pass
#
# class A(B,C,D):
# # def test(self):
# # print('from A')
# pass
#
# # obj=A()
# # obj.test()
# print(A.mro())
'''