③ 多个装饰器的执行顺序
一个函数可以搭配多个修饰器使用,执行的顺序:「从下往上,就近原则,靠近函数定义的先执行
」。验证代码示例如下:
def func_a(func): def decorator(): func() print("Call func_a") return decorator def func_b(func): def decorator(): func() print("Call func_b") return decorator def func_c(func): def decorator(): func() print("Call func_c") return decorator @func_a @func_b @func_c def func_t(): pass if __name__ == '__main__': func_t()
运行结果如下:
Call func_c Call func_b Call func_a
④ 四种不同类型的装饰器
Python中有四种不同类型的装饰器,分别是:「函数装饰函数」「函数装饰类」「类装饰函数」
「类装饰类」, 和类有关的装饰器可以等后面学完类和对象再回头看,不用死记,用到的时候
照葫芦画瓢改改就好。另外类装饰函数或类主要依赖类的__call__
函数,当使用@形式将装饰器 附加到函数上时,就会调用该函数。
- 「函数装饰函数」,使用代码示例如下:
def func_func(func): def decorator(a, b): print("函数装饰的函数名:", func.__name__) result = func(a, b) return result return decorator @func_func def func_add(a, b): return a + b if __name__ == '__main__': print(func_add(1, 2))
运行结果如下:
函数装饰的函数名: func_add 3
- 「函数装饰类」,使用代码示例如下:
def func_class(cls): def decorator(name): print("函数装饰的类:", cls.__name__, name) return cls(name) return decorator @func_class class A: def __init__(self, n): self.n = n def show(self): print("a = " + self.n) a = A('123') a.show()
运行结果如下:
函数装饰的类: A 123 a = 123
- 「类装饰函数」,使用代码示例如下:
class class_func: def __init__(self, _func): self._func = _func def __call__(self, name): print("类装饰的函数名:", self._func.__name__, name) return self._func(name) @class_func def func(a): return a if __name__ == '__main__': print(func('123'))
运行结果如下:
类装饰的函数名: func 123 123
- 「类装饰类」,使用代码示例如下:
class class_class: def __init__(self, _cls): self._cls = _cls def __call__(self, name): print("类装饰的类的类名:", self._cls.__name__, name) return self._cls(name) @class_class class A: def __init__(self, a): self.a = a def show(self): print('self.a = ', self.a) if __name__ == '__main__': a = A('123') a.show()
运行结果如下:
类装饰的类的类名: A 123 self.a = 123