python面向对象-多继承-父类中有同名属性方法

多继承中的特殊情况

python中子类可以继承多个父类,如果多个父类中有 同名 的方法,调用时会执行哪一个?

见下面UML类图:

注意:
两个父类都有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()方法

多继承的注意事项

根据上面代码,我们发现一些问题,所以我们要注意:

  1. 在开发时,尽量 避免多继承
  2. 如果继承多个父类,避免多个父类具有 同名方法 的情况
  3. 如果有 同名方法 ,默认执行 第一个父类 的方法(上节的__init__()方法也是)

方法解析顺序

如果多个父类有 同名方法,在调用时到底 调用时哪一个?

__mro__类属性

在python中,通过类属性__mro__查看搜索顺序。

mro:是 Method Resolution Order 方法解析顺序

代码:

print(SmartPhone.__mro__)

在调用方法时,就按照上面打印的类顺序搜索,如果找到就执行

总结

  1. 在开发时,尽量 避免多继承
  2. 如果继承多个父类,避免多个父类具有 同名方法 的情况
  3. 当父类有同名方法时,会调用第一个父类的方法
  4. 通过类属性__mro__查看方法解析顺序

原文出处:/show_1EF2GeUCgWSo.html