python中什么是继承和多继承_Python的单继承和多继承,多重

本文详细探讨了Python中的继承概念,包括单继承和多继承。通过实例展示了如何在子类中调用父类的方法,并解释了在多继承情况下如何决定调用哪个父类的方法,涉及到MRO(Method Resolution Order)的概念。总结了Python继承的基本规则,即子类首先查找自身方法,若无则按MRO顺序查找父类。
摘要由CSDN通过智能技术生成

我们用两部分来写写Python的继承,分为单继承和多继承。在《流畅的Python》11和12章介绍了协议和抽象基类,以及继承的优点缺点,抽象基类这块真的很抽象…我觉得自己能看懂,却真的写不出来啥,乱写一通没有啥意思,我实在是写不好。我们就来写写继承好了,以及Python继承的一些调用方式。

第一部分,单继承

和C++的继承一样,子类可以继承父类的方法,我们从一个简单的例子说起

class A():

def fun(self):

print('A class fun here')

class B(A):

pass

b = B()

b.fun()

'''输出

A class fun here

'''

就和我们预想的一样,虽然B类中没有fun()函数,但是因为B继承自A,所以可以调用A的fun()函数。那么如果我们在B里也定义fun()函数呢?

class B(A):

def fun(self):

print('B class fun here')

b = B()

b.fun()

'''输出

B class fun here

'''

这样情况下将会优先调用子类的对应函数。但是我们仍然可以显示的去执行父类的函数,比如这样

class A():

def fun(self):

print('A class fun here')

class B(A):

def fun(self):

#这两种写法都是可以的

super().fun()

#super(B,self).fun()

b = B()

b.fun()

'''输出

A class fun here

'''

利用super()函数,我们可以选择调用父类的函数,很多时候我们都需要在子类的初始化函数中调用父类的初始化函数__init__()

第二部分,多重继承

结合单继承的几个例子,我们看看Python多继承是如何执行的

class A():

def fun(self):

print('A class fun here')

class B():

def fun(self):

print('B class fun here')

class C(A,B):

pass

# class C(B,A):

# pass

c = C()

c.fun()

#输出 A class fun here

此时C继承A和B,这个时候我们调用fun(),发现执行的是A的fun(),为什么不是B的呢?我们尝试把继承的顺序调换一下看看

class A():

def fun(self):

print('A class fun here')

class B():

def fun(self):

print('B class fun here')

# class C(A,B):

# pass

class C(B,A):

pass

c = C()

c.fun()

#输出 B class fun here

我们发现这个时候,执行的是B的fun(),看来到底执行那个父类的方法并不是随机的,是由什么东西控制的。其实关键就是一个叫做MRO的东西,我们看看下列代码

class A():

def fun(self):

print('A class fun here')

class B():

def fun(self):

print('B class fun here')

class C1(A,B):

pass

class C2(B,A):

pass

print('C1 MRO',C1.__mro__)

print('C2 MRO',C2.__mro__)

C1().fun()

C2().fun()

'''输出

C1 MRO (, , , )

C2 MRO (, , , )

A class fun here

B class fun here

'''

在发现子类中没有对应方法后,开始在父类中寻找对应方法,寻找是按照一个顺序进行的,这个顺序就存放在类的__mro__成员变量中。(object是python中所有定义的类的超类,在python2中,自定义的类都要继承自object,python3中则不需要再显示的写出来,但是仍然会继承自object)

关于Python的MRO,其实还有很多细节部分,是的,我完全写不了,,有兴趣了解的可以查看专门的介绍,另外,抽象类的继承还有更多的细节。

第三部分,总结

子类首先在自己的方法里找,若是找不到的话就会去继承的父类中找,单继承自然是去唯一的父类中找,若是多继承,则按照__mro__的顺序进行查找。

虽然我进行了检查,但是也难免有出错,若有错误望指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值