有没有办法通过猴子修补向 class __init__ 方法添加参数?

Is there a way to add an argument to class __init__ method with monkey patching?

如果有 class

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

有没有办法通过猴子修补这个class来添加另一个参数?如何将发生在 __init__ 中的所有内容保持原样,而不在任何地方重复?

你可能可以通过子类化来做同样的事情,而不需要猴子补丁。您可以添加新的位置参数,或者只是将更多项目放入 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

这有效:

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

它还影响 类 是 A:

的子类
old_init = A.__init__

def new_init(self, foo, *args, *kwargs):
    old_init(self, *args, *kwargs)
    self.foo = foo

A.__init__ = new_init