Как использовать функцию класса в качестве декоратора, который сам принимает параметр в python?

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

class dec(object):
    
    def __init__(self, str1, str2):
        self.str1 = str1
        self.str2 = str2
        print(f"printing from init via ----- str1={self.str1} , str2={self.str2}")
        
    def onef(self,f,s):
        print(f"printing from init via onef ----- str1={self.str1} , str2={self.str2}")
        print("onef --------- up")
        f()
        print(f"printing s = {s}")
        print("onef --------- down")
        
d=dec(str1='Hey',str2='hi')        
@d.onef(s='in onef ok !')
def f():
    print("The F --- function")

сообщение об ошибке

printing from init via ----- str1=Hey , str2=hi
Traceback (most recent call last):
  File "C:\Users\Anuj\Desktop\decorators.py", line 16, in <module>
    @d.onef(s='in onef ok !')
TypeError: dec.onef() missing 1 required positional argument: 'f'

Ранее пробовал этот.

class dec(object):
    
    def __init__(self, str1, str2):
        self.str1 = str1
        self.str2 = str2
        print(f"printing from init via ----- str1={self.str1} , str2={self.str2}")
        
    def onef(self,f):
        print(f"printing from init via onef ----- str1={self.str1} , str2={self.str2}")
        print("onef --------- up")
        f()
        print("onef --------- down")
        
d=dec(str1='Hey',str2='hi')        
@d.onef
def f():
    print("The F --- function")

Это сработало. Ответ

printing from init via ----- str1=Hey , str2=hi
printing from init via onef ----- str1=Hey , str2=hi
onef --------- up
The F --- function
onef --------- down

Вернуться на верх