如果我无法更改超类的代码,有没有办法包装超类的所有方法?
作为一个最小的工作示例,请考虑这个基类Base
,它有许多返回自身新实例的方法,以及派生类Child
class Base:
def __init__(self, val):
self.val = val
def newinst_addseven(self):
return Base(self.val + 7)
def newinst_timestwo(self):
return Base(self.val * 2)
# ...
class Child(Base):
@property
def sqrt(self):
return math.sqrt(self.val)
这里的问题是调用childinstance.newinst_addseven()
返回一个实例Base
, 代替Child
.
有没有办法把Base
类的方法强制返回该类型的值Child
?
有了这样的包装:
def force_child_i(result):
"""Turn Base instance into Child instance."""
if type(result) is Base:
return Child(result.val)
return result
def force_child_f(fun):
"""Turn from Base- to Child-instance-returning function."""
def wrapper(*args, **kwargs):
result = fun(*args, **kwargs)
return force_child_i(result)
return wrapper
非常感谢!
PS:我目前所做的就是看看Base
的源代码并将方法添加到Child
直接,这不太可维护:
Child.newinst_addseven = force_child_f(Base.newinst_addseven)
Child.newinst_timestwo = force_child_f(Base.newinst_timestwo)