您当前的位置: 首页 >  Python
  • 1浏览

    0关注

    214博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

python(20):闭包和装饰器

不愿透露姓名の网友 发布时间:2019-11-27 14:47:39 ,浏览量:1

在这里插入图片描述

文章目录
  • 一、闭包(英语:Closure)
    • 1.闭包三个要求
    • 2.__closure__判断函数是否为闭包函数
  • 二、装饰器
    • 1.单个装饰器
    • 2.多个装饰器
    • 3.计算函数执行时间的装饰器(装饰器的一个作用)
    • 4.创建有返回值的装饰器
    • 5.property装饰器

一、闭包(英语:Closure) 1.闭包三个要求

以下这个例子就是一个最简单的闭包

def fun1():
    name = '张三'

    def inner():
        print(name)

    return inner


f = fun1()
f()

在这里插入图片描述

那么作为闭包要有以下三个条件:

  1. 闭包函数必须有内嵌函数
  2. 内嵌函数必须要引用外层函数的变量
  3. 闭包函数返回内嵌函数的地址
2.__closure__判断函数是否为闭包函数

如果是闭包的话会返回一个cell对象,不是闭包返回None

def fun1():
    name = '张三'

    def inner():
        print(name)

    print(inner.__closure__)
    return inner


f = fun1()
f()

在这里插入图片描述

不是闭包的情况

def fun2():
    def inner():
        print('我不是闭包,因为我没有使用外层变量')

    print(inner.__closure__)
    return inner


f = fun2()
f()

在这里插入图片描述

二、装饰器
  • 本质:一个闭包函数
  • 作用:在不修改原函数及其调用方式的情况下对原函数功能进行拓展
  • 语法糖: @装饰器名称
1.单个装饰器
def fun1(f):
    def inner():
        print('---------------')
        f()
        print('************')

    return inner


@fun1
def f():
    print('我是大帅哥')

f()

在这里插入图片描述

2.多个装饰器
def fun1(f):
    def inner():
        print('我是装饰器1的上半部分')
        f()
        print('我是装饰器2的下半部分')

    return inner


def fun2(f):
    def inner():
        print('我是装饰器2的上半部分')
        f()
        print('我是装饰器2的下半部分')

    return inner


@fun1
@fun2
def f():
    print('我是大帅哥')


f()

在这里插入图片描述

3.计算函数执行时间的装饰器(装饰器的一个作用)
import time


def fun1(f):
    def inner():
        a = time.time()
        f()
        b = time.time()
        print(b - a)

    return inner


@fun1
def f():
    c=102*123+23332*12
    print(c)

f()

在这里插入图片描述

4.创建有返回值的装饰器
def fun1(f):
    def inner():
        f()
        return '我是返回值'

    return inner


@fun1
def f():
    print('我是f函数')


ret = f()
print(ret)

在这里插入图片描述

5.property装饰器

静态属性:@property。作用就是把类的函数属性,封装成类似数据属性。再调用函数printmassage 时候,必须不带()执行。

简单来说就是把不带参数的类中方法当属性使用

class Student(object):
    school='szu'

    @property
    def printmassage(self):
        print('aaaa')


s1 = Student()
s1.printmassage  

在这里插入图片描述

关注
打赏
1657102503
查看更多评论
立即登录/注册

微信扫码登录

0.0828s