day26

今日内容:继承
    继承介绍
    继承与抽象
    属性查找
    继承的实现原理
    菱形问题
    继承原理
    深度优先和广度优先
    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())
'''

 

posted @ 2020-08-06 16:18  板鸭没有腿  阅读(75)  评论(0)    收藏  举报