文章目录
一、闭包(英语:Closure)
1.闭包三个要求
- 一、闭包(英语:Closure)
- 1.闭包三个要求
- 2.__closure__判断函数是否为闭包函数
- 二、装饰器
- 1.单个装饰器
- 2.多个装饰器
- 3.计算函数执行时间的装饰器(装饰器的一个作用)
- 4.创建有返回值的装饰器
- 5.property装饰器
以下这个例子就是一个最简单的闭包
def fun1():
name = '张三'
def inner():
print(name)
return inner
f = fun1()
f()
那么作为闭包要有以下三个条件:
- 闭包函数必须有内嵌函数
- 内嵌函数必须要引用外层函数的变量
- 闭包函数返回内嵌函数的地址
如果是闭包的话会返回一个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()
- 本质:一个闭包函数
- 作用:在不修改原函数及其调用方式的情况下对原函数功能进行拓展
- 语法糖: @装饰器名称
def fun1(f):
def inner():
print('---------------')
f()
print('************')
return inner
@fun1
def f():
print('我是大帅哥')
f()
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()
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()
def fun1(f):
def inner():
f()
return '我是返回值'
return inner
@fun1
def f():
print('我是f函数')
ret = f()
print(ret)
静态属性:@property。作用就是把类的函数属性,封装成类似数据属性。再调用函数printmassage 时候,必须不带()执行。
简单来说就是把不带参数的类中方法当属性使用
class Student(object):
school='szu'
@property
def printmassage(self):
print('aaaa')
s1 = Student()
s1.printmassage