解析Python类中的钻石继承 [英] Resolving Diamond Inheritance within Python Classes

查看:0
本文介绍了解析Python类中的钻石继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下Python代码:

class Parent(object):
    def __init__(self, name, serial_number):
        self.name = name
        self.serial_number = serial_number


class ChildA(Parent):
    def __init__(self, name, serial_number):
        self.name = name
        self.serial_number = serial_number
        super(ChildA, self).__init__(name = self.name, serial_number = self.serial_number)

    def speak(self):
        print("I am from Child A")


class ChildB(Parent):
    def __init__(self, name, serial_number):
        self.name = name
        self.serial_number = serial_number
        super(ChildB, self).__init__(name = self.name, serial_number = self.serial_number)

    def speak(self):
        print("I am from Child B")


class GrandChild(ChildA, ChildB):
    def __init__(self, a_name, b_name, a_serial_number, b_serial_number):
        self.a_name = a_name
        self.b_name = b_name
        self.a_serial_number = a_serial_number
        self.b_serial_number = b_serial_number
        super(GrandChild, self).__init_( something )

在孙子代中运行super函数时,如何设置__init__参数的格式以使ChildA和ChildB都获得正确的参数?

另外,如何从孙子类中访问speak方法的两个不同版本(ChildA版本和ChildB版本)?

推荐答案

所以,当您从孙子辈调用Super时,ChildA__init__方法将被调用,因为Super遵循__mro__属性(父母从左到右,祖父母从左到右,然后是曾祖父母,...)

由于ChildAinit也调用Super,因此所有超级调用都将被链接,从而调用子项b的__init__并最终调用父init。

要实现这一点,您的界面通常需要保持一致。也就是说,位置参数需要具有相同的含义,并且顺序相同。

在情况并非如此的情况下,关键字参数可能工作得更好。

class Parent:    
    def __init__(self, name, serial, **kwargs):
        self.name = name
        self.serial = serial

class ChildA(Parent):    
    def __init__(self, a_name, a_serial, **kwargs):
        self.a_name = a_name
        self.a_serial = a_serial
        super().__init__(**kwargs)

class ChildB(Parent):    
    def __init__(self, b_name, b_serial, **kwargs):
        self.b_name = b_name
        self.b_serial = b_serial
        super().__init__(**kwargs)


class GrandChild(ChildA, ChildB):
    def __init__(self):
        super().__init__(name = "blah", a_name = "a blah", b_name = "b blah", a_serial = 99, b_serial = 99, serial = 30)

还请注意,在您的代码中,名称和序列作为实例属性在所有类之间重复使用,这可能不是您想要的。

这篇关于解析Python类中的钻石继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆