装饰器的一般语法结构如下: ```python def decorator(func): def wrapper(): # 新增功能或者附加限制条件 # ... return func() return wrapper ``` 装饰器函数可以不用使用装饰器语法糖@,而是采用原始的方式进行调用。例如,下面是一个用于计算函数运行时间的装饰器函数,它的等效写法是: ```python import time def my_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print("Function took {:.6f} seconds.".format(end_time - start_time)) return result return wrapper def my_function(x): time.sleep(x) return x decorated_function = my_decorator(my_function) print(decorated_function(2)) ``` 装饰器也可以用类进行实现,我们可以定义一个类,将需要被装饰的函数作为一个参数传递给类的构造函数,并重载类的__call__方法。 例如,下面是一个用于计算函数运行时间的类装饰器,它的等效写法是: ```python import time class MyDecorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): start_time = time.time() result = self.func(*args, **kwargs) end_time = time.time() print("Function took {:.6f} seconds.".format(end_time - start_time)) return result @MyDecorator def my_function(x): time.sleep(x) return x print(my_function(2)) ``` ### 单参数被装饰函数 ```python def my_decorator(func): def wrapper(arg): print("Calling function...") result = func(arg) print("Function returned: ", result) return result return wrapper @my_decorator def my_function(x): return x * 2 my_function(2) # 输出:Calling function... Function returned: 4 ``` ### 多参数被装饰函数 ```python def my_decorator(func): def wrapper(*args, **kwargs): print("Calling function...") result = func(*args, **kwargs) print("Function returned: ", result) return result return wrapper @my_decorator def my_function(x, y, z): return x + y + z my_function(2, 3, z=4) # 输出:Calling function... Function returned: 9 ```