继承

摘要
 
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)绑定后,根据 "绑定类名.属性名()"  找后续
"""

 

 

 

 

 

 

posted @ 2021-12-06 19:48  tslam  阅读(28)  评论(0编辑  收藏  举报