父类如何在Python中调用自己的方法

时间:2016-09-17 18:26:06

标签: python inheritance mixins

我正在尝试使用Mixins,Val15MyCollectionVal5创建具体的课程Val10Val15正试图从values继承MyCollection。在Val15实例化后,我正在尝试同时调用Val10Val5 value,并将其添加到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

1 个答案:

答案 0 :(得分:1)

这是有趣的部分:

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

此解决方案不会对将要配置继承的方式做出任何假设。

<强>说明:

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