2012-07-30 48 views
2

我已经写了一个PHP应用程序,并有一个问题,我不能以一种很好的方式在PHP中解决。所以我正在考虑将它移植到Ruby或Python--我从未使用过的两种语言。据我所见,这个问题可以在Ruby中解决,现在我的问题是如果我可以用Python解决它:在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)和两个扩展。

+1

我不确定我是否理解。为什么你不能使用简单的继承? – mgilson 2012-07-30 16:36:55

+0

啊,我忘了这个:E1也应该可以使用没有E2和E2也应该可以使用没有E2。谢谢。 – stofl 2012-07-30 16:46:06

+1

@stofl:你的意思是“E1”,对吧? – gahooa 2012-07-30 16:47:55

回答

2

正如mailson建议的那样,多重继承是最佳选择。一个简单的

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

应该做你需要的。

编辑: 要做到这一点动态,你可以使用类型:

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

EDIT2:杜格尔打我给它:d

+1

这将意味着(困难)编写自定义类E,对吧?我不想编写“启用E1和E2” - 我想配置它(没有类似于E类代码的自动生成)。 – stofl 2012-07-30 17:50:56

+0

非常感谢! – stofl 2012-07-30 18:34:51

1

你可以做建议的多重继承没有硬编码是这样的:

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

这就好比做

class E(A, E1, E2): 
    pass 

但允许您动态指定mixin。

+0

谢谢。那很棒! – stofl 2012-07-30 18:34:24