在Python中,父类如何在自身内部调用自己的方法

2024-04-27 00:57:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用mixin,MyCollectionVal5Val10创建具体的类Val15Val15正在尝试从MyCollection继承values。当Val15被实例化时,我试图调用Val10Val5value,并将它们添加到Val15values。你知道吗

但是,Val15将只继承Val10的值,所有类都将调用Val10的值。你到底怎样才能推翻这个问题?你知道吗

class MyCollection(object):
    def __init__(self):
        super().__init__()
        self.values = []


class MyMessage(object):
    def __init__(self):
        super().__init__()

    def message(self):
        print('Hello World')


class Val10(object):
    def __init__(self):
        super().__init__()
        print('Call 10')
        self.values.append(self.value())

    def value(self):
        print('Value 10')
        return 10


class Val5(object):
    def __init__(self):
        super().__init__()
        print('Call 5')
        self.values.append(self.value())

    def value(self):
        print('Value 5')
        return 5


class Val15(Val10, Val5, MyMessage, MyCollection):
    def __init__(self):
        super().__init__()

    def my_sum(self):
        return sum(self.values)


val15 = Val15()
val15.my_sum()
val15.message()

# Result:
# Call 5
# Value 10
# Call 10
# Value 10
# Hello World

Tags: selfobjectinitvaluedefcallclassvalues
1条回答
网友
1楼 · 发布于 2024-04-27 00:57:13

有趣的是:

class Val10(object):
    def value(self):
        return 10

class Val5(object):
    def value(self):
        return 5

要获得父级值的总和,必须分别调用它们:

class Val15(Val10, Val5):
    def value(self):
        return Val10.value(self) + Val5.value(self)

替代解决方案

另一种方法是定义value总是返回所有继承值的总和,不管它们是什么,而不知道要调用哪个父类value

class Val10:
    def value(self):
        previous = getattr(super(), 'value', lambda: 0)()
        return previous + 10

class Val5:
    def value(self):
        previous = getattr(super(), 'value', lambda: 0)()
        return previous + 5

class Val15(Val10, Val5):
    def value(self):
        return getattr(super(), 'value', lambda: 0)()

Val15().value()  # 15

此解决方案不对继承的配置方式进行任何假设。你知道吗

备注:

  • 答案假设这是python3,因为super()语法
  • getattr(super(), 'value', lambda: 0)返回父类的绑定value方法(如果存在),或者默认为返回0的函数。你知道吗

相关问题 更多 >