Рассмотрим этот небольшой пример:
import datetime as dt
class Timed(object):
def __init__(self, f):
self.func = f
def __call__(self, *args, **kwargs):
start = dt.datetime.now()
ret = self.func(*args, **kwargs)
time = dt.datetime.now() - start
ret["time"] = time
return ret
class Test(object):
def __init__(self):
super(Test, self).__init__()
@Timed
def decorated(self, *args, **kwargs):
print(self)
print(args)
print(kwargs)
return dict()
def call_deco(self):
self.decorated("Hello", world="World")
if __name__ == "__main__":
t = Test()
ret = t.call_deco()
который печатает
Hello
()
{'world': 'World'}
Почему параметр self
(который должен быть экземпляром Test obj) не передан в качестве первого аргумента декорированной функции decorated
?
Если я сделаю это вручную, например:
def call_deco(self):
self.decorated(self, "Hello", world="World")
работает так, как ожидалось. Но если я должен знать заранее, если функция украшена или нет, она побеждает всю цель декораторов. Какая картина должна идти здесь, или я что-то не понял?