python装饰器学习笔记

python装饰器学习笔记一

合理地使用装饰器,能够减少代码冗余,使代码的可读性更高,结构更加清晰,还能实现一些神奇的功能。

例1:实现函数运行前后打印信息

"""装饰器————日志打印"""
# 定义装饰器
def logger(func):
    def wrapper(*args, **kwargs):
        print("start: {}".format(func.__name__))

        func(*args, **kwargs)

        print("end")
    return wrapper

@logger
def add(n,m):
    print(n+m)
    return n+m

add(3,4)

运行结果:

start: add
7
end

例2:实现函数运行时间计时:

"""装饰器————时间计时器"""
import time
def timer(func):
    def wrapper(*args, **kwargs):
        time_start = time.time()
        print("开始时间:{}".format(time_start))

        func(*args, **kwargs)

        time_end = time.time()
        print("结束时间:{}".format(time_end))

        cost_time = time_end - time_start
        print("cost time: {}".format(cost_time))
    return wrapper

@timer
def sleep_func(time_):
    print("开始睡着")
    time.sleep(time_)
    print("睡醒了")

sleep_func(3)

运行结果:

开始时间:1589000558.8140652
开始睡着
睡醒了
结束时间:1589000561.8142624
cost time: 3.000197172164917

例3:装饰器传递参数,适用于实现大致功能一致,部分不同的装饰器

"""传参数的装饰器————嵌套"""
def say_hello(contry):
    def wrapper(func):
        def deco(*args, **kwargs):
            if contry == "china":
                print("你好!")
            elif contry == "america":
                print("hello!")
            else:
                return

            func(*args, **kwargs)
        return deco
    return wrapper

@say_hello("china")
def chinese():
    print("我来自中国。")

@say_hello("america")
def american():
    print("I am from America")

chinese()
american()

运行结果:

你好!
我来自中国。
hello!
I am from America

例4:不带参数的 装饰器

class logger2(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("[INFO]: the function {func} is running"
              .format(func=self.func.__name__))
        return self.func(*args, **kwargs)

@logger2
def say(something):
    print("say {}!".format(something))

say("hello")

运行结果:

[INFO]: the function say is running
say hello!

例5:带参数的 装饰器

"""带参数的!类装饰器!"""

class logger3(object):
    def __init__(self, msg, level="INFO"):
        self.msg = msg
        self.level = level

    def __call__(self, func):
        def wrapper(*args,**kwargs):
            print("[{level}]: The function \"{name}\" {msg}"
                  .format(level=self.level, msg=self.msg, name=func.__name__))
            func(*args, **kwargs)
        return wrapper

@logger3(msg="is running", level="INFO")
def say(something):
    print("say {}!".format(something))

say("hello~")

运行结果:

[INFO]: The function "say" is running
say hello~!

例6:自带的property装饰器,实现自定义类属性的封装调用

"""自带的property装饰器"""
class Student(object):
    def __init__(self, name):
        self.name = name
        self._age = None

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise ValueError("输入不合法:年龄必须为整数!")
        if not 0<value<100:
            raise ValueError("输入不合法:年龄范围在0-100之间")
        self._age=value
        print("赋值完成")

    @age.deleter
    def age(self):
        del self._age
        print("删除成功")

xh = Student("小红")
xh.age = 18
print(xh.age)
del xh.age

运行结果:

赋值完成
18
删除成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值