继承
是一种新建类的方式,子类继承了一个父类,子类就有了父类的属性和方法
通常我们叫父类叫做基类,叫子类叫做派生类
新式类
只要继承了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类是空白类,自然也就找不到方法。
使用类名来调用其方法可以不是继承关系,如果要使用多层继承关系的父类的方法,就只能使用类名调用方法的途径来调用间接父类的方法。