我正在使用以下类结构导入Python库(称为animals.py):
class Animal(object): pass
class Rat(Animal): pass
class Bat(Animal): pass
class Cat(Animal): pass
...
我想为每个物种类添加一个父类(Pet
)(Rat
,Bat
,Cat
,...);但是,我无法更改我导入的库的实际来源,因此它必须是运行时更改。
以下似乎有效:
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>
这是一个故意的一般性问题。我对注入父母的不同方法感兴趣,并对这些方法的优缺点进行评论。我同意这种运行时的诡计会让代码变得非常混乱。如果我选择ZODB,我会做一些明确的事情。现在,作为python的普通用户,我对一般情况感到好奇。
答案 0 :(得分:1)
您的方法几乎是如何动态完成的。真正的问题是:这个新的父类添加了什么?如果您尝试在已存在于已存在的类中的方法链中插入您自己的方法,并且它们未正确编写,您将无法;如果你要添加原始方法(例如接口层),那么你可能只需要使用函数。
我是一个拥抱Python动态性质的人,使用你提供的代码没问题。确保你有适当的单元测试(动态或非动态;),修改继承树实际上可以让你做你需要的,并享受Python!
答案 1 :(得分:0)
你应该努力不要这样做。这很奇怪,很可能会流泪。
正如@agf提到的,你可以使用Pet作为mixin。如果您告诉我们更多关于您想要插入父类的原因,我们可以帮助您找到更好的解决方案。