Определите декоратор как метод внутри классаPython

Программы на Python
Ответить
Anonymous
 Определите декоратор как метод внутри класса

Сообщение Anonymous »

Я пытаюсь создать внутри своего класса метод, который подсчитывает полное выполнение определенной функции. Я хочу использовать простой декоратор. Я нашел эту ссылку и переписал этот простой скрипт:

Код: Выделить всё

class myclass:
def __init__(self):
self.cnt = 0

def counter(function):
"""
this method counts the runtime of a function
"""
def wrapper(self, **args):
function(**args)
self.counter += 1
return wrapper

@myclass.counter
def somefunc():
print("hello from somefunc")

if __name__ == "__main__":
obj = myclass()
# or if comment @myclass.counter
# somefunc = myclass.counter(somefunc)
somefunc()
И, конечно же, я получаю:

Код: Выделить всё

TypeError: wrapper() missing 1 required positional argument: 'self'
Я попытался переписать счетчик как метод класса:

Код: Выделить всё

class myclass:
def __init__(self):
self.cnt = 0

def counter(self, function):
"""
this method counts the runtime of a function
"""
def wrapper(**args):
function(**args)
self.cnt += 1
return wrapper

def somefunc():
print("hello from somefunc")

if __name__ == "__main__":
obj = myclass()
somefunc = obj.counter(somefunc)
for i in range(10):
somefunc()
print(obj.cnt)
Это прекрасно работает, но я думаю, что это неверное определение декоратора. Есть ли способ определить декоратор внутри метода класса и передать собственный аргумент его функции? или определение декоратора внутри класса бесполезно?
РЕДАКТИРОВАТЬ: ------
Во-первых, я не могу определить украшение вне метода класса. Во-вторых, я пытаюсь создать запланированный класс, который запускает определенную функцию (в качестве входных данных) в течение фиксированного интервала и определенного количества времени, поэтому мне нужно ее посчитать.

Подробнее здесь: https://stackoverflow.com/questions/499 ... side-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»