有没有办法通过猴子修补向 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
如果有 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