类的继承

一丶继承介绍

什么是继承
    继承是一种新建类的方式,新建的类称之为子类、派生类,被继承的类称之为父类、基类、超类

    python中继承的特点:
        1.继承的特性:子类可以遗传、重用父类的属性
        2.python中一个子类可以同时继承多个父类
        3.在继承背景下去说,python中的类分为两种:新式类,经典类
            新式类:但凡继承了object的类Foo,以及该类的子类...都是新式类
                在python3中一个类即便是没有显示地继承任何类,默认就会继承object
                即python3中所有的类都是新式类
            经典类:没有继承object的类,以及该类的子类...都是经典类
                在python2中才区分新式类与经典类
                在python2中一个类如果没有显示地继承任何类,也不会会继承object

二丶利用继承来解决类与类之间的代码冗余问题

继承关系的查找
总结对象之间的相似之处得到类,总结类与类之间的相似之处就得到了类们的父类

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):
    #     self.name = name
    #     self.age = age
    #     self.sex = sex
    #     self.score = score
    def choose_course(self):
        print('%s choosing course'%self.name)

class oldboyTeacher(oldboyPeople):
    # def __init__(self,name,age,sex,level):
    #     self.name = name
    #     self.age = age
    #     self.sex = sex
    #     self.level = level
    def score(self,stu,num):
        stu.score = num

stu1 = oldboyStudent('蕲艾',18,'male')
print(stu1.__dict__)

tea1 = oldboyTeacher('egon',18,'male')
print(tea1.__dict__)

三丶在子类派生的新方法中重用父类功能的方式一

在子类派生出的新方法中重用父类功能的方式一:
指名道姓的引用某一个类中的函数
总结:
1. 与继承无关
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,num = 0):
        oldboyPeople.__init__(self,name,age,sex)

        self.score = num

    def choose_course(self):
        print('%s is choosing course' %self.name)


class oldboyTeacher(oldboyPeople):
    def __init__(self,name,age,sex,level):
        oldboyPeople.__init__(self,name,age,sex)

        self.level = level

    def score(self,stu,num):
        stu.score = num


stu1 = oldboyStudent('蕲艾',18,'female')
print(stu1.__dict__)

tea1 = oldboyTeacher('egon',18,'male',10)
print(tea1.__dict__)

四丶在单继承背景下的属性查找

在单继承背景下的属性查找的顺序:对象->对象的类->父类->...
class Foo:
    def f1(self):
        print('Foo.f1')

    def f1(self):
        print('Foo.f2')
        self.f1() # obj.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

obj = Bar()
obj.f2
'''
Foo.f2
Bar.f1
'''

五丶在多继承背景下的属性查找

在多继承背景下属性的查找优先级:
如果一个子类继承多个分支(多个分支没有共同继承一个非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)

菱形继承问题:
新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类

新式类(广度优先): obj->A->B->E->C-F->D->G->object
经典类(深度优先): obj->A->B->E->G->C-F->D

六丶在子类派生的新方法中重用父类功能的方式二

在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
在python2中:super(自己的类名,自己的对象)
在python3中:super()
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
总结:
  1. 严格依赖继承的mro列表
  2. 访问是绑定方法,有自动传值的效果

class A:
    def f1(self):
        print('A.f1')
        super().f2()

class B:
    def f2(self):
        print('B.f2')

class C(A,B):
    def f2(self):
        print('C.f2')

obj=C()
print(C.mro())
obj.f1()
'''
A.f1
'''

原文地址:https://www.cnblogs.com/Mister-JH/p/9506350.html