1 回答
TA贡献1828条经验 获得超3个赞
你可以让你的装饰器工作,你只需要让它成为一个描述符类,而不是一个函数。您需要实现该__set_name__方法以获取对您已添加到的类的引用。使用类引用,您可以进行两个参数的super调用:
import functools
class after:
def __init__(self, method):
self.method = method
def __set_name__(self, owner, name):
self.owner = owner
self.name = name # using self.method.__name__ might be better?
def __get__(self, instance, owner):
if instance is None:
return self
return functools.partial(self, instance)
def __call__(self, instance, *args, **kwargs):
assert(self.owner is not None and self.name is not None)
getattr(super(self.owner, instance), self.name)(*args, **kwargs)
return self.method(instance, *args, **kwargs)
你也可以这样做before,这几乎是一样的,只是最后两行以相反的顺序(以及一些处理返回值的摆弄)。
我注意到这个装饰器比调用super普通方法的用处要小得多,因为你不能有效地与被覆盖的方法返回的值交互,或者改变传递给它的参数。没有before或after修饰的方法可以复制这些类:
class Foo:
def foo(self, x, y):
return x + y
class Bar(Foo):
def foo(self, x, y, z):
return super().foo(x//2, y+1) * z
添加回答
举报