多继承中的特殊情况
python中子类可以继承多个父类,如果多个父类中有 同名 的方法,调用时会执行哪一个?
注意:
两个父类都有get_about()方法
代码:
Phone类
class Phone:
def __init__(self,cpu,ram,rom):
self.cpu=cpu
self.ram=ram
self.rom=rom
print(str(self.__class__)+" init")
def call(self,number):
print("打电话给:%s"%number)
def sms(self,number,message):
print("发短信给:%s,消息:%s"%(number,message))
def get_about(self):
return "这是普通手机"
IntelligentDevice类
class IntelligentDevice:
def __init__(self,cpu):
print(str(self.__class__)+" init")
def install_app(self,app_name):
print("安装 %s"%app_name)
def uninstall_app(self,app_name):
print("卸载 %s"%app_name)
def get_about(self):
print("这是智能设备")
SmartPhone类
class SmartPhone(Phone,IntelligentDevice):
pass
调用
iphone=SmartPhone()
print(iphone.get_about())
根据执行结果可知,调用了 第一个父类 的get_about()方法
交互两个父类的位置
修改SmartPhone类,将两个父类的位置交互
class SmartPhone(IntelligentDevice,Phone):
pass
调用
iphone=SmartPhone()
print(iphone.get_about())
根据执行结果可知,调用了 第一个父类 的get_about()方法
多继承的注意事项
根据上面代码,我们发现一些问题,所以我们要注意:
- 在开发时,尽量 避免多继承
- 如果继承多个父类,避免多个父类具有 同名方法 的情况
- 如果有 同名方法 ,默认执行 第一个父类 的方法(上节的
__init__()方法也是)
方法解析顺序
如果多个父类有 同名方法,在调用时到底 调用时哪一个?
__mro__类属性
在python中,通过类属性__mro__查看搜索顺序。
mro:是 Method Resolution Order 方法解析顺序
代码:
print(SmartPhone.__mro__)
在调用方法时,就按照上面打印的类顺序搜索,如果找到就执行
总结
- 在开发时,尽量 避免多继承
- 如果继承多个父类,避免多个父类具有 同名方法 的情况
- 当父类有同名方法时,会调用第一个父类的方法
- 通过类属性
__mro__查看方法解析顺序
