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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值