【问题标题】:Pythonic Approach to Multiple Parent Method Calls多父方法调用的 Pythonic 方法
【发布时间】:2015-05-22 19:36:03
【问题描述】:

假设我有以下类结构:

class Mixin1(Base1):
    def get_data(self):
        # Gather some data in some way


class Mixin2(Base2):
    def get_data(self):
        # Gather some data in another way


class MyClass(Mixin1, Mixin2):
    def get_data(self):
        # Gather some data in yet another way.  Then...
        # Get Mixin2's version of get_data.  Then...
        # Get Mixin1's version of get_data.

提供一些上下文的示例是Mixin1 是身份验证处理程序,Mixin2 是登录处理程序。父类中的功能将填充实例变量(例如错误消息)。

调用父级的 get_data 方法最符合 Pythonic 的方法是什么?

获取此类信息的一种方法可能是这样的:

original_class = self.__class__.__base__
parents = [base for base in original_class.__bases__]
for parent in parents:
    parent.get_data()

我不认为这是一种不合理的方法,但如果我必须开始爬入元数据,我会开始怀疑是否有更 Pythonic 的方法。

有什么建议吗?是否可以为此使用super()

【问题讨论】:

  • super() 正是您应该使用的,因为它旨在解决这个问题。
  • 您应该阅读Super considered super,它准确地解释了如何在多重继承场景中使用 super。
  • @kindall 你如何处理使用super() 选择调用哪个父方法的情况?如果您想按特定顺序调用它们怎么办?
  • 如果我正确阅读“超级被认为是超级”,它只会调用一个超级并掩盖其他。 Rico 想要称呼这两个超级英雄。
  • 来自文档:“第二个用例是支持协作多重继承”。合作意味着类层次结构中的所有类都设计为一起工作。如果super 没有从所有这些中调用,则它们的设计不正确。

标签: python multiple-inheritance


【解决方案1】:
class MyClass(Mixin1, Mixin2):
    def get_data(self):
        # do local stuff
        data2 = Mixin2.get_data(self)
        data1 = Mixin1.get_data(self)

另外,this post 似乎是相关的。

另一种方法是使用包含而不是继承。

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2014-03-24
    相关资源
    最近更新 更多