1 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
你可以讓你的裝飾器工作,你只需要讓它成為一個描述符類,而不是一個函數(shù)。您需要實現(xiàn)該__set_name__方法以獲取對您已添加到的類的引用。使用類引用,您可以進行兩個參數(shù)的super調(diào)用:
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,這幾乎是一樣的,只是最后兩行以相反的順序(以及一些處理返回值的擺弄)。
我注意到這個裝飾器比調(diào)用super普通方法的用處要小得多,因為你不能有效地與被覆蓋的方法返回的值交互,或者改變傳遞給它的參數(shù)。沒有before或after修飾的方法可以復(fù)制這些類:
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
添加回答
舉報