多重继承与设计模式
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 中提取出一些共同行为时,这非常有用。
在 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 中提取出一些共同行为时,这非常有用。