类的继承

mac2022-06-30  102

继承

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

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

新式类

只要继承了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中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

属性的查找顺序

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

利用继承减少代码冗余

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

子类中调用父类的方法

使用类名调用其他类方法

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

使用关键字 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

最新回复(0)