【问题标题】:Multi inheritance and design pattern多继承和设计模式
【发布时间】:2019-07-20 22:57:30
【问题描述】:

facebook-python-business-sdk 库中,我看到了一些我认为这是不好的做法:

AdAccountUserMixin 的 get_pages() 方法使用 self.iterate_edge() 既不是此类的方法也不是父类的方法。

AbstractCrudObject 实现了这个方法。

然后,AdAccountUser 继承自这两个类。这就是为什么 AdAccountUser 的对象可以使用 get_pages() 方法的原因。

小例子:

class AbstractBar:
   def bar(self, x):
       return x

class Foo:
   def foo(self, x):
       return self.bar(x)

class Test(Foo, AbstractBar):
   def test(self, x):
       return self.foo(x)


t = Test()

t.test(5) # returns 5

这是一种设计模式,你每天都能看到,还是只是一种不好的做法?

【问题讨论】:

    标签: python design-patterns multiple-inheritance


    【解决方案1】:

    这是很普通的mixin class 东西。 mixin 类是一个明确设计用于补充给定基类或接口的类(它明确依赖于它“混合”的类来实现给定接口)。当您想从一堆实现相同接口但没有共同祖先的类中提取一些常见行为时,这非常有用。

    【讨论】:

    • Mixin 类 Foo 不应该有一个“抽象”方法 bar() 引发 NotImplementedError 或类似的东西吗?或者这只是不是pythonic或者你只看到抽象类的东西?
    • 如果你在 mixin 类中定义了这个“抽象”方法,你就不能再使用协作的super 调用了。 mixin 的文档应该清楚地记录它的“主机”类应该实现哪个接口,仅此而已。鉴于 Python 的高度动态性,这些检查大多是无用的(“bar”方法也可以作为金钱补丁添加到代码的不同部分 - brittlle,难以维护,绝对不是一个好习惯,但有时是问答修复比损坏的应用更好,至少在您可以发布适当的干净修复之前)。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多