本文已参与「新人创作礼」活动,一起开启掘金创作之路
• 闭包:是由函数及其相关的引用环境组合而成的实体。
• 不同编程语言实现闭包的方式是不同的,Python中闭包从表现形式 上看,如果在一个内部函数里,对在外部作用域(不是在全局作用 域)的变量进行引用,那么内部函数就被认为是闭包。
• 闭包中不可以直接修改外部函数的局部变量。
– 类似于不能直接在函数中修改全局变量(可变类型除外),需要使用关键 字nonlocal。
• 闭包的作用:
– 当闭包执行完后,仍然能够保持住当前的运行环境
– 闭包可以根据外部作用域的局部变量来得到不同的结果
装饰器
• 装饰器本质上是一个Python函数,它可以在不改变代码结构的情况 下给代码添加新的功能。
• 装饰器的工作过程:将被装饰的函数当作参数传递给装饰器函数 (名称相同的函数),并返回装饰后被装饰的函数。
• 装饰器是闭包的一种应用。
• 装饰器的使用:
@装饰器函数
def func():
pass
• 装饰器的作用:
def light(func):
print("获得神光棒x1")
def tiga():
func()
print("叮~,\n我是光之巨 人")
return tiga
@light
def person():
print("我是某胜利队队员大骨")
person()
def light(func):
print("获得神光棒x1")
def tiga():
func()
print("叮~,\n我是光之巨 人")
return tiga
def person():
print("我是某胜利队队员大骨")
light(person)()
• 装饰器不会改变原有函数代码,但是会丢失一部分信息:
– 被装饰函数的元信息会丢失,如:名字、文档字符串、注解和参数签名。
• 为了保留因为使用装饰器而丢失的信息,可以使用Python中本身提 供的装饰器@warps来解决。
在类中使用装饰器
def singleton(cls, *args, **kw): instance={} def _singleton(): if cls not in instance: instance[cls]=cls(*args, **kw) return instance[cls] return _singleton @singleton class Singleton(object): def __init__(self): self.num_sum=0 def add(self): self.num_sum=100