【问题标题】:Is there a way to add an argument to class __init__ method with monkey patching?有没有办法通过猴子补丁向类 __init__ 方法添加参数?
【发布时间】:2026-01-29 16:15:02
【问题描述】:

如果有课

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

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

【问题讨论】:

  • 为什么需要专门为monkey-patch初始化?您可以直接将新属性添加到实例中吗?
  • 您可能希望将某些行为分开,例如登录到程序的单独部分。

标签: python monkeypatching


【解决方案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

【讨论】:

  • 这基本上是我下面的答案。
  • @Alex G Rice:问题是关于猴子补丁,你的答案不是,我不能单独使用继承,因为我不能接触从我正在修补的类继承的类等等
  • 我明白了——抱歉我误解了这个问题。很高兴您通过继承和猴子补丁的组合解决了这个问题。
【解决方案2】:

它也影响作为 A 子类的类:

old_init = A.__init__

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

A.__init__ = new_init

【讨论】:

    【解决方案3】:

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

    【讨论】: