Предположим, я хочу реализовать декоратор, который должен работать с функциями, методами c, методами класса или обычными методами:
class decorator:
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
return self.f(*args, **kwargs)
class C:
@decorator
def f(self, x):
print(x)
@decorator
@classmethod
def h(cls, x):
print(x)
@decorator
def g(x):
print(x)
c = C()
c.f(1) # Fails.
g(2) # Works.
C.h(3) # Fails.
Лучшее, что я могу придумать, это:
class decorator:
def __get__(self, instance, owner):
return type(self.f).__get__(self.f, instance, owner)
Интересно, это правильный способ реализации дескрипторов? Должен ли я аналогичным образом реализовать __del__
и __set__
?