【发布时间】:2022-01-06 21:55:02
【问题描述】:
类中方法的类装饰器如何工作?以下是我通过一些实验所做的示例:
from functools import wraps
class PrintLog(object):
def __call__(self, func):
@wraps(func)
def wrapped(*args):
print('I am a log')
return func(*args)
return wrapped
class foo(object):
def __init__(self, rs: str) -> None:
self.ter = rs
@PrintLog()
def baz(self) -> None:
print('inside baz')
bar = foo('2')
print('running bar.baz()')
bar.baz()
这非常好用。但是,我的印象是不需要用() 调用装饰器,但是当我从@PrintLog() 中删除括号时,我得到了这个错误:
def baz(self) -> None:
TypeError: PrintLog() takes no arguments
有什么我遗漏/不明白的地方吗?我也试过用__init__() 传递一个一次性的arg,它可以工作。
class PrintLog(object):
def __init__(self, useless):
print(useless)
def __call__(self, func):
@wraps(func)
def wrapped(*args):
print('I am a log')
return func(*args)
return wrapped
class foo(object):
def __init__(self, rs: str) -> None:
self.ter = rs
@PrintLog("useless arg that I'm passing to __init__")
def baz(self) -> None:
print('inside baz')
同样,这可行,但我不想将任何参数传递给装饰器。
tl;dr: This question 在 python 3.x 中。
帮助表示赞赏!
【问题讨论】:
标签: python python-3.x class decorator class-decorator