做影视网站怎么,深圳专业建网站多少钱,自己做物流网站,做网站选哪个语言声明#xff1a;本内容非盈利性质#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站#xff0c;会尽量附上原文链接#xff0c;并鼓励大家看原文。侵删。
5.2.2 简单装饰器
装饰器的形式就是一个闭包#xff0c;下面是一个简单的定义并使用…声明本内容非盈利性质也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站会尽量附上原文链接并鼓励大家看原文。侵删。
5.2.2 简单装饰器
装饰器的形式就是一个闭包下面是一个简单的定义并使用装饰器的例子。如下 def house():print(我是毛坯房……)
这是一个原函数下面我们要自定义一个装饰器并为这个原函数添加装饰器的效果。
# 定义一个装饰器
def decorate(func): # 定义装饰器函数它的参数是一个函数a 100print(wrapper开始加载......)def wrapper():func() # func()代表被装饰的原函数使用中可根据需要放置其位置print(----刷漆)print(----铺地板, a)print(----做装潢)print(wrapper加载完成......)return wrapper # 返回值是内部函数# 定义函数并使用装饰器
decorate # 装饰器在定义被装饰函数时使用自定义装饰器的名称就是我们定义装饰器函数闭包函数时的函数名
def house():print(我是毛坯房……)# 调用函数可以看出打印结果中带有装饰器的效果
house()# 打印函数名查看函数的特性
print(house) # 输出结果为function decorate.locals.wrapper at 0x0000029C7675D310打印house但输出wrapper是因为装饰器装返回值给了house由上面的例子可以看出装饰器有如下特点
装饰器是一个闭包装饰器以函数为参数。
为什么在被装饰器装饰后调用原函数会有装饰效果我们仔细考虑一下装饰器的作用过程
装饰器的效果被打印了上面的例子中说明装饰器被调用了打印函数名显示内存地址时出现了与装饰器内层函数相关的内容上面例子中说明函数的地址是指向装饰器内层函数的地址的因此我们可以推测当调用原函数时装饰器内层函数会被返回给了被装饰函数即被装饰后装饰器的内层函数就代表了被装饰函数。
即然装饰器的内层函数代表了被装饰函数那么需要我们考虑一种情况当被装饰函数有参数时装饰器的内层函数需要不需要保持参数列表的对应不一定是一致答案是肯定的。如下 被装饰函数有参数而装饰器的内层函数没有参数时运行会报错def decorate(func): # 定义装饰器函数a 100print(wrapper开始加载......)def wrapper(): # 原函数有参此处没有参数func(8) # func(x)相当于原函数的调用直接写定一个参数print(----刷漆)print(----铺地板, a)print(----做装潢)print(wrapper加载完成......)return wrapper# 使用装饰器
decorate
def house(n):print(我是毛坯房{}.format(n))house(3) # 定义的原函数有参数调用时参数是不能为空的# 运行结果会报如下错误TypeError: decorate.locals.wrapper() takes 0 positional arguments but 1 was given这说明我们一定要给装饰器的内层函数设置参数
被装饰函数有参数装饰器的内层函数也需要参数def decorate(func): # 定义装饰器函数a 100print(wrapper开始加载......)def wrapper(*x): # 原函数有参因此此处也要有参可以是单参数x也可以是可变参数 *xfunc(x) # func(x)相当于原函数的调用也要有参可以是可变参数 *xprint(----刷漆)print(----铺地板, a)print(----做装潢{}.format(x))print(wrapper加载完成......)return wrapper# 使用装饰器
decorate
def house(n):print(我是毛坯房{}.format(n))house(3) # 定义的原函数有参数调用时参数是不能为空的