有没有办法用猴子补丁为类__init__方法添加一个参数?

时间:2016-12-21 16:37:59

标签: python monkeypatching

如果有课程

Class A:
    def __init__(arg1, kwarg1=...):
        ...something happens here with args and kwargs

有没有办法通过猴子修补这个类来添加另一个参数?如何保留其中__init__所发生的一切,而不是在任何地方重复?

3 个答案:

答案 0 :(得分:1)

这有效:

from package import module

class ChangedInitClass(module.SomeClass):
    def __init__(self, arg1, another_arg, kwarg1=...):
        super().__init__(arg1, kwarg1=kwarg1)
        # does something with another_arg

module.SomeClass = ChangedInitClass

答案 1 :(得分:1)

它也会影响 A 的子类:

old_init = A.__init__

def new_init(self, foo, *ar, *kw):
    old_init(self, *ar, *kw)
    self.foo = foo

A.__init__ = new_init

答案 2 :(得分:0)

你可以通过子类化做同样的事情,而不需要猴子补丁。您可以添加新的位置参数,或者只是将更多项目投入kwargs。像这样:

Class A:
    """same class A as before"""
    def __init__(self, arg1, kwarg1=...):
        ...something happens here with args and kwargs

Class B(A):
    def __init__(self, another_arg, arg, **kwargs):
        A.__init__(self, arg, **kwargs)
        # B does something with another_arg here