当前位置:   article > 正文

Python 面对对象(下):装饰器_python 装饰器 操作对象的值

python 装饰器 操作对象的值

1.什么是装饰器

        python装饰器就是用于拓展原来函数功能的一种函数。通过使用装饰器可以给函数或类增强功能,并且还可以还可以快速的给不同的函数或类插入相同的功能。

1.1定义装饰器

        想要在Python中使用装饰器就需要使用一个特殊的符号“@”来实现。在定义装饰器装饰函数或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类之前。例如·:

  1. @ run_data
  2. def han_fun():
  3. pass

        在Python程序中使用装饰器后,上述代码定义的函数han_fun()可以只定义自己所需要的功能,而装饰器所定义的功能会自动插入函数han_fun()中,这样就可以节约大量具有相同的函数或类的代码。即使是不同目的或不同类的函数或类,也可以插入完全相同的功能。

        装饰器的目的:

                        在不改变原函数的情况下,去增强函数的功能

如何去定义一个装饰器
        利用的是闭包

1.嵌套函数
功能是:用一个函数去增强另个一函数,
       增强:无非就是在执行原函数之前或者之后额外做一些其他的操作
2.因为会把原函数作为参数传给装饰器的函数
3.利用闭包原理:内层函数应用外层函数的变量(传入的装饰器函数的参数)
4.返回内层函数

 定义一个简单的装饰

  1. def outer(func): #传入要增强的函数func
  2. def inner(): #定义内层函数
  3. print("Action")
  4. func()
  5. print("After")
  6. return inner
  7. def text(): #定义一个函数
  8. print("This is a text")
  9. inner = outer(text)
  10. inner()

输出:

 使用装饰器:

  1. def outer(func):
  2. def inner():
  3. print("Action Before")
  4. func()
  5. print("Action After")
  6. return inner
  7. @outer
  8. def test():
  9. print("This is a test")
  10. test()

输出:

 1.2使用装饰器装饰函数

        

  1. def zz(fun): #定义一个装饰器函数zz()
  2. def wrapper(*args, **kwargs): #定义一个包装器函数wrapper()
  3. print("开始运行。。。")
  4. fun(*args, **kwargs) #使用被装饰函数
  5. print("运行结束。。。。")
  6. return wrapper #返回包装器函数wrapper()
  7. @zz #装饰函数语句
  8. def demo_decoration(x): #定义普通函数,他被装饰器装饰
  9. a = [] #定义空列表a
  10. for i in range(x): #遍历x的值
  11. a.append(i) #将i添加到末尾列表
  12. print(a)
  13. @zz
  14. def hello(name): #定义普通函数,他被装饰器装饰
  15. print('hello', name)
  16. if __name__ == '__main__':
  17. demo_decoration(5) #调用被装饰器装饰的函数demo_decoration()
  18. print()
  19. hello('浪潮') #调用被装饰器装饰的函数hello()

输出结果:

 1.3使用装饰器装饰类

        代码如下:

  1. def zz(myclass): #定义一个能够装饰类的装饰器zz()
  2. class InnerClass: #定义一个内嵌类InnerClass来代替被装饰的类
  3. def __init__(self, z = 0): #构造函数
  4. self.z = 0
  5. self.wrapper = myclass() #实例化被装饰的类
  6. def position(self):
  7. self.wrapper.position()
  8. print('z轴坐标', self.z)
  9. return InnerClass #放回新定义的类
  10. @zz #使用装饰器
  11. class coordination: #定义一个普通的方法coordination
  12. def __init__(self, x = 0, y = 0):
  13. self.x = x #初始化x
  14. self.y = y #初始化y
  15. def position(self): #定义普遍方法position()
  16. print('x轴坐标', self.x) #显示x轴坐标
  17. print('y轴坐标', self.y) #显示y轴坐标
  18. if __name__ == "__main__": #当直接运行模块的时候,以下代码会执行,当导入模块时程序不会执行
  19. coo = coordination()
  20. coo.position()

输出:

 1.4给装饰器传值

  1. def wrapper(arg):
  2. def outer(func):
  3. def inner(*args, **kwargs):
  4. print(arg,"Action Before")
  5. func(*args, **kwargs)
  6. print(arg, "Action After")
  7. return inner
  8. return outer
  9. @wrapper("111")
  10. def test(arg1):
  11. print("This is a test")
  12. test(222)

输出:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/336256
推荐阅读
相关标签
  

闽ICP备14008679号