如果有课程
Class A:
def __init__(arg1, kwarg1=...):
...something happens here with args and kwargs
有没有办法通过猴子修补这个类来添加另一个参数?如何保留其中__init__
所发生的一切,而不是在任何地方重复?
答案 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