我想更新python模块中的一些父类,以便为所有子类添加一个功能。该模块通过pip
安装。
如果我可以修改父类,我只需要添加方法。但是,我不应该编辑已安装的模块。 (跟随我之前的discussion)
如何在不编辑pip包目录中的文件的情况下为python包中的所有子类添加功能?
另一种选择是使用monkeypatching,但似乎太棘手了。
具体情况是我想向Child1
和Child2
添加常用方法,但不能编辑Parent,因为它是pip
包的类。
class Parent:
...
class Child1(Parent):
...
class Child2(Parent):
...
答案 0 :(得分:0)
class Parent:
...
class Mixin:
def common_method (self, ...):
....
class Child1 (Parent, Mixin):
....
class Child2 (Parent, Mixin):
...
OR
class Parent:
...
class Augmented (Parent):
def common_method (self, ...):
....
class Child1 (Augmented):
....
class Child2 (Augmented):
...
答案 1 :(得分:0)
我不推荐这个,但您可以使用setattr
class Parent:
age = 50
class Child(Parent):
age = 20
def test(cls):
print cls.age
setattr(Parent, 'some_func', classmethod(test))
Parent.some_func()
Child.some_func()
此输出
50
20
答案 2 :(得分:0)
如果模块不依赖于C代码,我认为猴子修补可能是枚举子类并手动添加方法的唯一解决方案。
class Parent(object):
def __init__(self, name):
self.name = name
class Child1(Parent): pass
class Child2(Parent): pass
from test_module import Parent, Child1, Child2
Parent.say = lambda self: self.name # monkey-patching
child1, child2 = Child1('Bob'), Child2('Larry')
print child1.say() # Bob
print child2.say() # Larry
在 Parent
和child1
实例化后,您甚至可以将方法添加到child2
,并且仍然可以访问它。这也适用于新的子类。
class Subchild(Child1): pass
Subchild('Moe').say() # Moe