类的继承

继承

是一种新建类的方式,子类继承了一个父类,子类就有了父类的属性和方法

通常我们叫父类叫做基类,叫子类叫做派生类

新式类

只要继承了object类,就是新式类,再python3中,默认继承object类。所以在python3中所有的类都是新式类。

python2中,类需要指定继承object类才是新式类

经典类

没有继承object的类,就是经典类

所以在python3中是没有经典类的,因为python3中默认继承object类

在python2中只要是没有指定继承object的都是经典类

子类继承父类就还获得父类的公共属性与公共方法

class A:
    name = 'gredae'
    def f1(self):
        print('A的f1方法。。。')

class B(A):
    age = 18
    def f2(self):
        print('B的f2方法。。。')

b = B()
print(b.name)   # gredae
print(b.age)   # 18
b.f1()   # A的f1方法。。。
b.f2()   # B的f2方法。。。

类的多继承

class A:
    name = 'gredae'
    def f1(self):
        print('A的f1方法。。。')

class B():
    age = 18
    def f2(self):
        print('B的f2方法。。。')

class C(A,B):
    pass

c = C()
print(c.name)   # gredae
print(c.age)   # 18
c.f1()   # A的f1方法。。。
c.f2()   # B的f2方法。。。

类的多层继承

class A:
    name = 'gredae'
    def f1(self):
        print('A的f1方法。。。')

class B(A):
    age = 18
    def f2(self):
        print('B的f2方法。。。')

class C(B):
    pass

c = C()
print(c.name)   # gredae
print(c.age)   # 18
c.f1()   # A的f1方法。。。
c.f2()   # B的f2方法。。。

继承的菱形问题:新式类和经典类的查找顺序是不一样的

新式类的查找属性:广度优先搜索

新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点。

经典类的查找属性:深度优先搜索

经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

属性的查找顺序

对象 ----> 类中找 ----> 父类中找(多继承) ----> 报错

利用继承减少代码冗余

通过将不同类里相同的属性与方法进行提取,再新建一个类,让功能复用的类去继承新建的这个类,这样就可以做到减少代码冗余的目的

子类中调用父类的方法

  1. 使用类名调用其他类方法

    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    class B():
        def __init__(self,name,age,sex):
            A.__init__(self,name,age)
            self.sex = sex
    
    b = B('abc',20,1)
    print(b.name)   # abc
    print(b.age)   # 20
    print(b.sex)   # 1
    
  2. 使用关键字 super 调用父类方法

    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    class B(A):
        def __init__(self,name,age,sex):
            super().__init__(name,age)
            self.sex = sex
    
    b = B('abc',20,1)
    print(b.name)   # abc
    print(b.age)   # 20
    print(b.sex)   # 1
    

使用 super 关键字的前提是被调用的类是该类的直接父类。并且 super 关键字是按照mro列表寻找父类,如果该类的父类是object类,那么就会报错。因为object类是空白类,自然也就找不到方法。

使用类名来调用其方法可以不是继承关系,如果要使用多层继承关系的父类的方法,就只能使用类名调用方法的途径来调用间接父类的方法。

原文地址:https://www.cnblogs.com/Gredae/p/11420367.html