Fin*_*inn 7 python oop inheritance monkeypatching
我正在使用以下类结构导入Python库(称为animals.py):
class Animal(object): pass
class Rat(Animal): pass
class Bat(Animal): pass
class Cat(Animal): pass
...
Run Code Online (Sandbox Code Playgroud)
我想一个父类(添加Pet)到每个品种类(的Rat,Bat,Cat,...); 但是,我无法更改我导入的库的实际来源,因此它必须是运行时更改.
以下似乎有效:
import animals
class Pet(object): pass
for klass in (animals.Rat, animals.Bat, animals.Cat, ...):
klass.__bases__ = (Pet,) + klass.__bases__
Run Code Online (Sandbox Code Playgroud)
这是将父类注入Python中的继承树而不修改要修改的类的源定义的最佳方法吗?
我正试图将持久性移植到控制实验室设备的大型库中.弄乱它是不可能的.我想Persistent试试ZODB 吧.我不想编写mixin/facade包装器库,因为我正在处理需要更新的应用程序代码中的100多个类和大量导入.我只是通过攻击我的入口点来测试选项:如上所示设置数据库,修补(但是在动物模块上拉动物种类而不是显式列表)然后在我退出时关闭数据库.
这是一个故意的一般性问题.我对注入父母的不同方法以及对这些方法的利弊的评论感兴趣.我同意这种运行时的诡计会让代码变得非常混乱.如果我选择ZODB,我会做一些明确的事情.现在,作为python的普通用户,我对一般情况感到好奇.
你的方法几乎就是如何动态地做到这一点。真正的问题是:这个新的父类添加了什么?如果您尝试将自己的方法插入到已存在的类中的方法链中,并且它们的编写不正确,那么您将无法这样做;如果您要添加原始方法(例如接口层),那么您可能只需使用函数即可。
我是一个拥护 Python 动态特性的人,并且使用您提供的代码不会有任何问题。确保您有良好的单元测试(动态或非动态;),并且修改继承树实际上可以让您做您需要的事情,并享受 Python!