Python基础(装饰器)

1.定义装饰器

装饰器:我们要增强函数的功能,比如,比如在函数调用前后自动打印日志,但又不希望修改函数的定义,
这种在代码运行期间动态增加功能的方式,称之为‘装饰器’(decorator)

#定义装饰器
import time
#计算函数运行时间
def run_time(func):
    def wrapper():
        start_time = time.time()
        func()#调用multiply函数
        spend_time = time.time() - start_time
        return spend_time
    return wrapper
@run_time#等价于multiply = run_time(multiply)
def multiply():
    sum = 0
    for i in range(5):
        sum = sum +i
    print(sum)
print(multiply())

2.使用装饰器

2.1使用方法一

#now = decorator(函数名)#装饰器不传入参数时
#now = decorator(参数)(函数名)#装饰器传入参数时
#now()#执行被装饰过的函数

2.2使用方法二

#@decorator#以定义的装饰器
# def f():#自定义函数
#     pass
# f()#执行被装饰过的函数

3.自身不传入参数的装饰器

def login(func):
    def wrapper(*args,**kargs):
        print('函数名:%s'% func.__name__)
        return func(*args,**kargs)
    return wrapper
@login
def f():
    print('inside decorator')
f()

4.自身传入参数的装饰器

def login(text):
    def decorator(func):
        def wrapper(*args,**kargs):
            print('%s---%s'% (text,func.__name__))
            return func(*args,**kargs)
        return wrapper
    return decorator
@login('this is a parameter of decorator')
def f():
    print('2021-02-21')
f()

4.1传参装饰器实例一

class Profile():
    def __init__(self):
        self.name = 'peter'
        self.sex = 'man'
        self.age = 22
        self.city = 'yunnan'
def pass_token(symbol):
    def decorator(func):
        def wrapper():
            if symbol == '20210221':
                profile = Profile()
                func(profile)
            else:
                print('pass_token错误!')
        return wrapper
    return decorator#返回装饰者
@pass_token('20210221')
def get_info(self):
    print(f'姓名:{self.name}\n性别:{self.sex}\n年龄:{self.age}\n所在地:{self.city}')
get_info()
#输出结果:
# 姓名:peter
# 性别:man
# 年龄:22
# 所在地:yunnan

4.2传参装饰器实例二

class Profile():
    def __init__(self):
        self.name = 'peter'
        self.sex = 'man'
        self.age = 22
        self.city = 'yunnan'
class Message():
    def __init__(self):
        self.type = 'text'
        self.content = 'hello'
        self.sender = 'peter'
def choose_func(symbol):
    def decorator(func):
        if symbol == 'user':
            def wrapper():
                profile = Profile()
                func(profile)
        elif symbol == 'message':
            def wrapper():
                message = Message()
                func(message)
        else:
            print('请检查装饰器参数')
        return wrapper
    return decorator
@choose_func('user')
def get_user(user):
    print(f'姓名:{user.name}\n性别:{user.sex}\n年龄:{user.age}\n所在地:{user.city}')
get_user()
#输出结果:
#姓名:peter
#性别:man
#年龄:22
#所在地:yunnan

@choose_func('message')
def get_message(message):
    print(f'消息类型:{message.type}\n内容:{message.content}\n发送者:{message.sender}')
get_message()
#输出结果:
#消息类型:text
#内容:hello
#发送者:peter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值