在python模块

时间:2016-03-10 06:48:24

标签: python inheritance metaprogramming

我想更新python模块中的一些父类,以便为所有子类添加一个功能。该模块通过pip安装。

如果我可以修改父类,我只需要添加方法。但是,我不应该编辑已安装的模块。 (跟随我之前的discussion

如何在不编辑pip包目录中的文件的情况下为python包中的所有子类添加功能?

另一种选择是使用monkeypatching,但似乎太棘手了。

更新

具体情况是我想向Child1Child2添加常用方法,但不能编辑Parent,因为它是pip包的类。

class Parent:
    ...

class Child1(Parent):
    ...

class Child2(Parent):
    ...

3 个答案:

答案 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代码,我认为猴子修补可能是枚举子类并手动添加方法的唯一解决方案。

test_module.py

class Parent(object):
    def __init__(self, name):
        self.name = name

class Child1(Parent): pass

class Child2(Parent): pass

other_file.py

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

Parentchild1实例化后,您甚至可以将方法添加到child2 ,并且仍然可以访问它。这也适用于新的子类。

class Subchild(Child1): pass

Subchild('Moe').say() # Moe