python基础篇 -- day09

23 篇文章 0 订阅
21 篇文章 1 订阅

装饰器

装饰器定义

  • 开放封闭原则:
    开放:对代码的拓展开放的,允许代码扩展、添加新功能。如更新地图,加新枪,等等。
    封闭:对源码的修改是封闭的。

  • 装饰器:
    装饰器:完全遵循开放封闭原则。
    装饰器: 在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。
    装饰器就是一个函数。

装饰器的作用

  • 计算函数的运行时间
  • 登陆验证

普通装饰器

def decorator(f):
    print("加载装饰器")

    def inner():
        print("开始装饰")
        f()
        print("装饰完毕")

    print("装饰器加载完毕")
    return inner


@decorator
def func():
    print("我是被装饰的函数")

func()

"""
结果:
加载装饰器
装饰器加载完毕
开始装饰
我是被装饰的函数
装饰完毕
"""

在这里插入图片描述

带返回值的装饰器

flag = False


# 定义一个装饰器函数
def decorator(func):
    def wrapper(*args, **kwargs):
        print('-----》进行用户的登录验证')
        r = func(*args, **kwargs)
        if r:
            return 'success'
        else:
            return 'fail'

    return wrapper


def login():
    global flag
    username = input('输入用户名:')
    password = input('输入密码:')
    if username == 'admin' and password == '123':
        flag = True


@decorator
def islogin():
    if flag:
        return True
    else:
        return False


# 调用login函数
login()

# 调用islogin函数
r = islogin()  # islogin = wrapper
print('===>', r)

结果:

输入用户名:admin
输入密码:123
-----》进行用户的登录验证
===> success

带参数装饰器

def decorator(number):  # number = 10
    print('----->1')

    def decorator1(func):  # func = show
        print('------>2')

        def wrapper(*args, **kwargs):
            print('--------->start')
            func(*args, **kwargs)
            print('--------->end')

        print('-------->3')
        return wrapper
    print('------>4')
    return decorator1


@decorator(10)
def show():
    print('------》调用show函数')

show()

结果:

----->1
------>4
------>2
-------->3
--------->start
------》调用show函数
--------->end

多层装饰器


def decorator1(func):
    print("decorator1")
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)  # func =  house
        print('铺地板')
        print('刷漆')

    return wrapper


def decorator2(func):  # func = 第一层wrapper
    print("decorator2")
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)
        print('买衣柜')
        print('买沙发')
        print('买电视,冰箱')

    return wrapper


@decorator2
@decorator1
def house():  # house = 第二层wrapper值
    print('------》毛坯房')


print(house)

house()

结果:

decorator1
decorator2
<function decorator2.< locals>.wrapper at 0x0000020B8828AE18>
------》毛坯房
铺地板
刷漆
买衣柜
买沙发
买电视,冰箱

多层装饰器的特点:
谁离原函数最近先执行哪个装饰器,将第一层装饰器的返回结果传给第二层装饰器。

匿名函数

lambda : 函数功能简单,不需要使用多次时则需要定义匿名函数
格式 : lambda [参数1-n] : 返回值(表达式)

# 这是一个函数
def add(a,b):
	r = a + b
	return r
	
# 定义为匿名函数
x = lambda a,b : a+b
r = x(5,2)
print(r)

高阶函数

  • sorted()
  • map()
  • reduce()
  • filter()

functools

functools模块
reduce()
partial() 偏函数
偏函数(Partial function)是通过将一个函数的部分参数预先绑定为某些值,
从而得到一个新的具有较少可变参数的函数。

from functools import partial, wraps
def add(x, y):
    return x + y

add1 = partial(add, 3)
r = add1(9)
print(r) # 默认已经传入了一个3 所以输出为12

int1 = partial(int, base=8)
print(int1('123')) # 已经固定了int里面的base = 8,所以输入进去数字会返回8进制表示 ---》83

wraps() : 消除装饰器带来的一些副作用
获取对象名:
house.__ name__ —> 获取函数名
house.__ doc__ —> 获取文档注释
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),
为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只敲代码的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值