Python——闭包和装饰器 学习笔记

闭包

# 外部函数接收姓名参数
def config_name(name):
    # 内部函数保存外部函数的参数,并且完成数据显示的组成
    def inner(msg):
        print(name+": "+msg)
    # 外部函数要返回内部函数
    return inner


# 创建闭包对象
Tom = config_name("Tom")
Jane = config_name("Jane")
Tom("Hello! Jane")
Jane("Hello! Tom")

装饰器

通用装饰器

# 定义通用装饰器
def decorator(func):	# 装饰器的参数类型为函数,且只有一个
    # 使用装饰器装饰已有函数的时候,内部函数的类型和要装饰的已有函数的类型保持一致
    def inner(*args, **kwargs):
        # 在内部函数对已有函数进行装饰
        print("正在努力执行加法计算")
        # *args:把元组里面的每一个元素,按照位置参数的方式进行传参
        # **kwargs:把字典里面的每一键值对,按照关键字的方式进行传参
        # 这里对元组合字典进行拆包,仅限于结合不定长参数的函数使用
        num = func(*args, **kwargs)
        return num
    return inner


@decorator      # show=decorator(show)
def show():
    return "hello world!"


show = show()
print(show)

多重装饰器

# 定义p装饰器
def decorator_p(func):
    def inner():
        p = "<p>"+func()+"</p>"
        return p
    return inner


# 定义div装饰器
def decorator_div(func):
    def inner():
        div = "<div>"+func()+"</div>"
        return div
    return inner


# 多装饰器由内向外执行,先执行decorator_p再执行decorator_div
@decorator_div      # show=decorator_div(decorator_p(show))
@decorator_p        # show=decorator_p(show)
def show():
    return "hello world!"


show = show()
print(show)

带参数装饰器

def return_decorator(flag):
    def decorator(func):
        def inner(sum1, sum2):
            if flag == "+":
                print("——正在运行加法运算——")
            elif flag == "-":
                print("——正在运行减法运算——")
            return func(sum1, sum2)
        return inner
    return decorator


@return_decorator("+")
def sum_add(num1, num2):
    result = num1 + num2
    return result


@return_decorator("-")
def sum_sub(num1, num2):
    result = num1 - num2
    return result


sum_add = sum_add(3, 3)
print(sum_add)
sum_sub = sum_sub(6, 3)
print(sum_sub)

类装饰器

# 定义类装饰器
class MyDecorator(object):
    def __init__(self, func):
        self.func = func

    # 实现__call__这个方法,让对象变成可调用的对象,可调用的对象能够像函数一样使用
    def __call__(self, *args, **kwargs):
        # 对已有函数进行封装
        print("登入微信成功")
        self.func()


@MyDecorator        # @MyDecorator  => show = MyDecorator(show)
def show():
    print("在微信聊天中.....")


# 执行show        # 执行MyDecorator类创建实例对象 -> show() => 对象()
show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值