2

我已经编写了一个 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)和两个扩展。

4

2 回答 2

2

正如mailson 建议的那样,多重继承是要走的路。一个简单的

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

应该做你需要的。

编辑:要动态进行,您可以使用类型:

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

EDIT2:Dougal 打败了我:D

于 2012-07-30T16:45:41.833 回答
1

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

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

这就像在做

class E(A, E1, E2):
    pass

但允许您动态指定 mixins。

于 2012-07-30T18:07:02.393 回答