赞
踩
python装饰器就是用于拓展原来函数功能的一种函数。通过使用装饰器可以给函数或类增强功能,并且还可以还可以快速的给不同的函数或类插入相同的功能。
想要在Python中使用装饰器就需要使用一个特殊的符号“@”来实现。在定义装饰器装饰函数或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类之前。例如·:
- @ run_data
- def han_fun():
- pass
在Python程序中使用装饰器后,上述代码定义的函数han_fun()可以只定义自己所需要的功能,而装饰器所定义的功能会自动插入函数han_fun()中,这样就可以节约大量具有相同的函数或类的代码。即使是不同目的或不同类的函数或类,也可以插入完全相同的功能。
装饰器的目的:
在不改变原函数的情况下,去增强函数的功能
如何去定义一个装饰器
利用的是闭包1.嵌套函数
功能是:用一个函数去增强另个一函数,
增强:无非就是在执行原函数之前或者之后额外做一些其他的操作
2.因为会把原函数作为参数传给装饰器的函数
3.利用闭包原理:内层函数应用外层函数的变量(传入的装饰器函数的参数)
4.返回内层函数
定义一个简单的装饰
- def outer(func): #传入要增强的函数func
- def inner(): #定义内层函数
- print("Action")
- func()
- print("After")
- return inner
- def text(): #定义一个函数
- print("This is a text")
-
- inner = outer(text)
- inner()
输出:
使用装饰器:
- def outer(func):
- def inner():
- print("Action Before")
- func()
- print("Action After")
- return inner
-
- @outer
- def test():
- print("This is a test")
-
-
- test()
输出:
- def zz(fun): #定义一个装饰器函数zz()
- def wrapper(*args, **kwargs): #定义一个包装器函数wrapper()
- print("开始运行。。。")
- fun(*args, **kwargs) #使用被装饰函数
- print("运行结束。。。。")
- return wrapper #返回包装器函数wrapper()
-
- @zz #装饰函数语句
- def demo_decoration(x): #定义普通函数,他被装饰器装饰
- a = [] #定义空列表a
- for i in range(x): #遍历x的值
- a.append(i) #将i添加到末尾列表
- print(a)
-
- @zz
- def hello(name): #定义普通函数,他被装饰器装饰
- print('hello', name)
-
- if __name__ == '__main__':
- demo_decoration(5) #调用被装饰器装饰的函数demo_decoration()
- print()
- hello('浪潮') #调用被装饰器装饰的函数hello()
输出结果:
代码如下:
- def zz(myclass): #定义一个能够装饰类的装饰器zz()
- class InnerClass: #定义一个内嵌类InnerClass来代替被装饰的类
- def __init__(self, z = 0): #构造函数
- self.z = 0
- self.wrapper = myclass() #实例化被装饰的类
-
- def position(self):
- self.wrapper.position()
- print('z轴坐标', self.z)
-
- return InnerClass #放回新定义的类
-
- @zz #使用装饰器
- class coordination: #定义一个普通的方法coordination
- def __init__(self, x = 0, y = 0):
- self.x = x #初始化x
- self.y = y #初始化y
- def position(self): #定义普遍方法position()
- print('x轴坐标', self.x) #显示x轴坐标
- print('y轴坐标', self.y) #显示y轴坐标
-
- if __name__ == "__main__": #当直接运行模块的时候,以下代码会执行,当导入模块时程序不会执行
- coo = coordination()
- coo.position()
输出:
- def wrapper(arg):
- def outer(func):
- def inner(*args, **kwargs):
- print(arg,"Action Before")
- func(*args, **kwargs)
- print(arg, "Action After")
- return inner
- return outer
-
- @wrapper("111")
- def test(arg1):
- print("This is a test")
-
-
- test(222)
输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。