Python中的原型设计功能?

时间:2012-07-30 16:24:49

标签: php python prototype-oriented

我编写了一个PHP应用程序,并且遇到了一个问题,我无法用PHP解决这个问题。所以我在考虑将它移植到Ruby或Python - 我以前从未使用过的两种语言。据我所见,这个问题可以在Ruby中解决,现在我的问题是如果我可以在Python中解决它:

应用程序的核心有一个我想要扩展的A类。有一个扩展E1通过方法doFoo扩展A,一个扩展E2通过方法doBar扩展A.现在我想使用这两个扩展而无需更改A,E1或E2的代码。在PHP中,这可以通过编写第三个扩展E3来存档,它提供了一个扩展A的类B,并在E1和E2中混合了特征或其他一些肮脏的技巧。但我希望能够拥有核心,拥有这两个扩展并在配置中获得信息:“使用扩展E1和E2”而不需要任何更多的类将所有内容放在一起(并且不使用__call() )。

这在Python中有可能以任何方式吗?我真的不需要在运行时可以更改的原型。 A的每个实例都应该有doFoo和doBar。

编辑:整个事情应该没有扩展,只有E1(没有E2),只有E2(没有E1)和两个扩展。

2 个答案:

答案 0 :(得分:2)

正如玛尔森所说,多重继承是可行的方法。一个简单的

class E(A, E1, E2):
    ...

应该做你需要的。

编辑: 要动态执行此操作,您可以使用type:

E = type("E", (A, E1, E2), {})

EDIT2:Dougal打败了我:D

答案 1 :(得分:1)

您可以执行建议的多重继承而无需像这样的硬编码:

mixins = (E1, E2)
E = type('E', (A,) + mixins, {})

就像在做

class E(A, E1, E2):
    pass

但允许您动态指定mixins。