Skip to content

Instantly share code, notes, and snippets.

Last active April 28, 2023 00:49
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
Декоратор класса. Для канала PyWay.
# copyright
import time
# это вспомогательный декоратор будет декорировать каждый метод класса, см. ниже
def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
delta = (te - ts) * 1000
print(f'{method.__name__} выполнялся {delta:2.2f} ms')
return result
return timed
def timeit_all_methods(cls):
class NewCls:
def __init__(self, *args, **kwargs):
# проксируем полностью создание класса
# как создали этот NewCls, также создадим и декорируемый класс
self._obj = cls(*args, **kwargs)
def __getattribute__(self, s):
# папа, у меня есть атрибут s?
x = super().__getattribute__(s)
except AttributeError:
# нет сынок, это не твой атрибут
# да сынок, это твое
return x
# объект, значит у тебя должен быть атрибут s
attr = self._obj.__getattribute__(s)
# метод ли он?
if isinstance(attr, type(self.__init__)):
# да, обернуть его в измеритель времени
return timeit(attr)
# не метод, что-то другое
return attr
return NewCls
class Foo:
def a(self):
print("медленный метод начался")
print("медленный метод кончился")
f = Foo()
# медленный метод начался
# медленный метод кончился
# a выполнялся 1000.17 ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment