python装饰器,掌握这几种就够用了

tech2026-06-11  3

1.入门装饰器

""" 入门装饰器 - 必须是函数嵌套 - 必须返回内部函数 """ def logger(func): def warpper(*args, **kwargs): print('开始执行') func(*args, **kwargs) print("执行完毕") return warpper @logger def add(): print(1+1) add()

2. 带参数的装饰器

""" 带参数的装饰器 - 需要三层嵌套 - 最外层是要传入的参数 - 第二层是要传入的函数 - 第三层代表要处理的函数 """ def hello(contry): # 参数 def wrapper(func): # 传入函数 def deco(*args, **kwargs): # 代表传入的函数 if contry == "中国": print("中国你好") elif contry == "美国": print("美国你好") else: return func(*args, **kwargs) return deco return wrapper @ hello('中国') def fun1(): print('我来自中国') @ hello('美国') def fun2(): print('我来自美国') fun1() print("-"*20) fun2()

3. 类装饰器

""" 类装饰器 - 必须实现__init__方法,接受被装饰函数 - 必须实现__call__方法,实现装饰逻辑,必须返回函数 """ class Logger(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print(self.func.__name__) return self.func @Logger def sekk(): pass sekk()

4. 带参数的类装饰器

""" 带参数的装饰器 - init 方法接收参数 - call 方法接收函数 - 并且在call方法中要嵌套函数并返回这个函数 """ class Logger2(object): def __init__(self, level="INFO"): self.level = level def __call__(self, func): # 接收函数 def wrapper(*args, **kwargs): print(self.level) func(*args, **kwargs) # 返货函数 return wrapper @Logger2(level='WARNING') def func3(): print("我是带参数的类装饰器") func3()

5. 使用装饰器实现单例模式

instance_obj = {} def singleton(cls): def get_instance(*args, **kwargs): class_name = cls.__name__ if class_name not in instance_obj: instance = cls(*args, **kwargs) instance_obj[class_name] = instance return instance_obj[class_name] return get_instance @singleton class Test1(object): def __init__(self, name): self.name = name t1 = Test1('tom') print(t1.name) t2 = Test1('janni') print(t2.name)

6. 带参数的类装饰器

class User(object): def __init__(self): pass @property def age(self): return self.__dict__['age'] @age.setter def age(self, value): if not isinstance(value, int): raise ValueError('输入不合法:年龄必须为数值!') if not 0 < value < 100: raise ValueError('输入不合法:年龄范围必须0-100') self.__dict__['age'] = value @age.deleter def age(self): del self.__dict__['age'] u = User() # 赋值 u.age = 25 # 查看 print(u.age) # 删除 del u.age
最新回复(0)