Python:在初始评估后向类中添加父类

时间:2011-09-13 20:42:59

标签: python oop inheritance monkeypatching

一般Python问题

我正在使用以下类结构导入Python库(称为animals.py):

class Animal(object): pass

class Rat(Animal): pass

class Bat(Animal): pass

class Cat(Animal): pass

...

我想为每个物种类添加一个父类(Pet)(RatBatCat,...);但是,我无法更改我导入的库的实际来源,因此它必须是运行时更改。

以下似乎有效:

import animals

class Pet(object): pass

for klass in (animals.Rat, animals.Bat, animals.Cat, ...): 
    klass.__bases__ = (Pet,) + klass.__bases__

这是将父类注入Python中的继承树而不修改要修改的类的源定义的最佳方法吗?

激励情况

我正试图将持久性移植到控制实验室设备的大型库中。弄乱它是不可能的。我想试试ZODB的Persistent。我不想编写mixin / facade包装器库,因为我正在处理需要更新的应用程序代码中的100多个类和大量导入。我只是通过攻击我的入口点来测试选项:如上所示设置数据库,修补(但是在动物模块上拉动物种类而不是显式列表)然后在退出时关闭数据库。 / p>

Mea Culpa /请求

这是一个故意的一般性问题。我对注入父母的不同方法感兴趣,并对这些方法的优缺点进行评论。我同意这种运行时的诡计会让代码变得非常混乱。如果我选择ZODB,我会做一些明确的事情。现在,作为python的普通用户,我对一般情况感到好奇。

2 个答案:

答案 0 :(得分:1)

您的方法几乎是如何动态完成的。真正的问题是:这个新的父类添加了什么?如果您尝试在已存在于已存在的类中的方法链中插入您自己的方法,并且它们未正确编写,您将无法;如果你要添加原始方法(例如接口层),那么你可能只需要使用函数。

我是一个拥抱Python动态性质的人,使用你提供的代码没问题。确保你有适当的单元测试(动态或非动态;),修改继承树实际上可以让你做你需要的,并享受Python!

答案 1 :(得分:0)

你应该努力不要这样做。这很奇怪,很可能会流泪。

正如@agf提到的,你可以使用Pet作为mixin。如果您告诉我们更多关于您想要插入父类的原因,我们可以帮助您找到更好的解决方案。