[email protected]九步装饰器

这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。

第一步:最简单的函数,准备附加额外功能

?


1

2

3

4

5

6

7

8


# -*- coding:gbk -*-

‘‘‘示例1: 最简单的函数,表示调用了两次‘‘‘

defmyfunc():

print("myfunc() called.")

myfunc()

myfunc()

第二步:使用装饰函数在函数执行前和执行后分别附加额外功能

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


# -*- coding:gbk -*-

‘‘‘示例2: 替换函数(装饰)

装饰函数的参数是被装饰的函数对象,返回原函数对象

装饰的实质语句: myfunc = deco(myfunc)‘‘‘

defdeco(func):

print("before myfunc() called.")

func()

print("  after myfunc() called.")

returnfunc

defmyfunc():

print(" myfunc() called.")

myfunc=deco(myfunc)

myfunc()

myfunc()

第三步:使用语法糖@来装饰函数

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16


# -*- coding:gbk -*-

‘‘‘示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”

但发现新函数只在第一次被调用,且原函数多调用了一次‘‘‘

defdeco(func):

print("before myfunc() called.")

func()

print("  after myfunc() called.")

returnfunc

@deco

defmyfunc():

print(" myfunc() called.")

myfunc()

myfunc()

第四步:使用内嵌包装函数来确保每次新函数都被调用

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


# -*- coding:gbk -*-

‘‘‘示例4: 使用内嵌包装函数来确保每次新函数都被调用,

内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象‘‘‘

defdeco(func):

def_deco():

print("before myfunc() called.")

func()

print("  after myfunc() called.")

# 不需要返回func,实际上应返回原函数的返回值

return_deco

@deco

defmyfunc():

print(" myfunc() called.")

return‘ok‘

myfunc()

myfunc()

第五步:对带参数的函数进行装饰

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


# -*- coding:gbk -*-

‘‘‘示例5: 对带参数的函数进行装饰,

内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象‘‘‘

defdeco(func):

def_deco(a, b):

print("before myfunc() called.")

ret=func(a, b)

print("  after myfunc() called. result: %s"%ret)

returnret

return_deco

@deco

defmyfunc(a, b):

print(" myfunc(%s,%s) called."%(a, b))

returna+b

myfunc(1,2)

myfunc(3,4)

第六步:对参数数量不确定的函数进行装饰

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


# -*- coding:gbk -*-

‘‘‘示例6: 对参数数量不确定的函数进行装饰,

参数用(*args, **kwargs),自动适应变参和命名参数‘‘‘

defdeco(func):

def_deco(*args,**kwargs):

print("before %s called."%func.__name__)

ret=func(*args,**kwargs)

print("  after %s called. result: %s"%(func.__name__, ret))

returnret

return_deco

@deco

defmyfunc(a, b):

print(" myfunc(%s,%s) called."%(a, b))

returna+b

@deco

defmyfunc2(a, b, c):

print(" myfunc2(%s,%s,%s) called."%(a, b, c))

returna+b+c

myfunc(1,2)

myfunc(3,4)

myfunc2(1,2,3)

myfunc2(3,4,5)

第七步:让装饰器带参数

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24


# -*- coding:gbk -*-

‘‘‘示例7: 在示例4的基础上,让装饰器带参数,

和上一示例相比在外层多了一层包装。

装饰函数名实际上应更有意义些‘‘‘

defdeco(arg):

def_deco(func):

def__deco():

print("before %s called [%s]."%(func.__name__, arg))

func()

print("  after %s called [%s]."%(func.__name__, arg))

return__deco

return_deco

@deco("mymodule")

defmyfunc():

print(" myfunc() called.")

@deco("module2")

defmyfunc2():

print(" myfunc2() called.")

myfunc()

myfunc2()

第八步:让装饰器带 类 参数

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34


# -*- coding:gbk -*-

‘‘‘示例8: 装饰器带类参数‘‘‘

classlocker:

def__init__(self):

print("locker.__init__() should be not called.")

@staticmethod

defacquire():

print("locker.acquire() called.(这是静态方法)")

@staticmethod

defrelease():

print("  locker.release() called.(不需要对象实例)")

defdeco(cls):

‘‘‘cls 必须实现acquire和release静态方法‘‘‘

def_deco(func):

def__deco():

print("before %s called [%s]."%(func.__name__,cls))

cls.acquire()

try:

returnfunc()

finally:

cls.release()

return__deco

return_deco

@deco(locker)

defmyfunc():

print(" myfunc() called.")

myfunc()

myfunc()

第九步:装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36


# -*- coding:gbk -*-

‘‘‘mylocker.py: 公共类 for 示例9.py‘‘‘

classmylocker:

def__init__(self):

print("mylocker.__init__() called.")

@staticmethod

defacquire():

print("mylocker.acquire() called.")

@staticmethod

defunlock():

print("  mylocker.unlock() called.")

classlockerex(mylocker):

@staticmethod

defacquire():

print("lockerex.acquire() called.")

@staticmethod

defunlock():

print("  lockerex.unlock() called.")

deflockhelper(cls):

‘‘‘cls 必须实现acquire和release静态方法‘‘‘

def_deco(func):

def__deco(*args,**kwargs):

print("before %s called."%func.__name__)

cls.acquire()

try:

returnfunc(*args,**kwargs)

finally:

cls.unlock()

return__deco

return_deco

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


# -*- coding:gbk -*-

‘‘‘示例9: 装饰器带类参数,并分拆公共类到其他py文件中

同时演示了对一个函数应用多个装饰器‘‘‘

frommylockerimport*

classexample:

@lockhelper(mylocker)

defmyfunc(self):

print(" myfunc() called.")

@lockhelper(mylocker)

@lockhelper(lockerex)

defmyfunc2(self, a, b):

print(" myfunc2() called.")

returna+b

if__name__=="__main__":

a=example()

a.myfunc()

print(a.myfunc())

print(a.myfunc2(1,2))

print(a.myfunc2(3,4))

时间: 2024-08-01 01:50:14

[email protected]九步装饰器的相关文章

pytest框架[email protected](scpoe=‘xxx')装饰器

pytest是一个非常成熟的全功能的Python测试框架 用例设计原则 谨记:当我们使用pytest框架写case的时候,一定要拿它的命令规范去case,这样框架才能识别到哪些case需要执行,哪些不需要执行文件名以test_.py文件和_test.py以Test开头的类以test_开头的函数以test_开头的方法 运行方式可以通过pycharm里的终端命令,也可以pytest.main()运行(主推) @pytest.fixture() 即测试用例执行的环境准备和清理,相当于unittest的

[email protected]动态代理-类加载器

一.测试单元     概述:用于测试JAVA代码的工具类,已内置在Eclipse中;     格式:         1.在方法的上面添加@Test;         2.对被测试的方法的要求:权限-public;返回值-void;参数-空参         [email protected]:在@Test标注的方法前执行,可以用于初始化;           @After:在@Test标注的方法后执行,可以用于释放资源; 二.注解     概述:java的一种数据类型,和类/接口在同一级别  

python中的无参装饰器和有参装饰器

python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3>.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器对象的调用方式的前提下为其扩展新功能: 4>.装饰器本质是函数,(即装饰其他函数)就是为其他函数添加附加功能. 一.典型装饰器案例 1 #!/usr/bin/env pyth

使用Mac OS X 终端连接[email protected]

环境准备: Xcode(直接AppStore下载安装) Git(可以在http://code.google.com/p/git-osx-installer/下载git安装程序,或者在https://www.kernel.org/pub/software/scm/git/下载源码安装.) 源码安装过程: 解压源码包 tar xjvf git-1.8.3.tar.bz2 编译 cd git-1.8.3 ./configure --prefix=/usr/local make 安装 sudo make

兄弟连学Python 装饰器和抽象类

#装饰器:对类或者函数进行功能的扩展 ''' #第一步:基本函数 def la(): print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天') #调用函数 la() la() #第二步:扩展函数功能(不能修改原函数) #用于扩展基本函数的函数 def kuozhan(func): #扩展功能1 print('la前参拜祈求') #调用基本函数 func() #扩展功能2 print('la后还愿感谢') #基本函数 def la(): print('脚踏黄河两岸,手拿机密文件,前

Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = lambda x,y: x+y print(f(1,2)) 二.三元表达式 # x >y ? x :y # 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果 x= 2 y=1 r = x if x > y else y print(r) # 2 三.map 四.map与lambda

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc():     print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 ? 1 2 3 4 5 6 7 8 9 10 11 12 13