多重继承与设计模式

Multi inheritance and design pattern

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

AdAccountUserMixin 的 get_pages() 方法使用了 self.iterate_edge() ,它既不是此 class 的方法,也不是父方法。

AbstractCrudObject 实现了这个方法。

然后,AdAccountUser继承自这两个class。这就是为什么 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

这是一种设计模式,您每天都会看到的东西还是一种不好的做法?

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