装饰器,说白了就是定义其他函数调用之前或之后需要执行的通用代码,可作用于其他任何函数,提高代码复用度。
>>> def deco(func): ... def inner(): ... print('running inner()') ... return inner ➊ ... >>> @deco ... def target(): ➋ ... print('running target()') ... >>> target() ➌ running inner() >>> target ➍ .inner at 0x10063b598>
➊ deco 返回 inner 函数对象。 ➋ 使用 deco 装饰 target。 ➌ 调用被装饰的 target 其实会运行 inner。 ➍ 审查对象,发现 target 现在是 inner 的引用。
严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做元编程(在运行时改变程序的行为)时。 综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时立即执行。
装饰器有个特点 它们在被装饰的函数定义之后立即运行
通常是在导入时(即 Python 加载模块时)Python执行装饰器
registry = [] ➊ def register(func): ➋ print('running register(%s)' % func) ➌ registry.append(func) ➍ return func ➎ @register ➏ def f1(): print('running f1()') @register def f2(): print('running f2()') def f3(): ➐ print('running f3()') def main(): ➑ print('running main()') print('registry ->', registry) f1() f2() f3() if __name__=='__main__': main() ➒
➊ registry 保存被 @register 装饰的函数引用。 ➋ register 的参数是一个函数。 ➌ 为了演示,显示被装饰的函数。 ➍ 把 func 存入 registry。 ➎ 返回 func:必须返回函数;这里返回的函数与通过参数传入的一样。 ➏ f1 和 f2 被 @register 装饰。 ➐ f3 没有装饰。 ➑ main 显示 registry,然后调用 f1()、f2() 和 f3()。 ➒ 只有把 registration.py 当作脚本运行时才调用 main()。
把 registration.py 当作脚本运行得到的输出如下: $ python3 registration.py running register() running register() running main() registry -> [, ] running f1() running f2() running f3()
做大型的项目呢吧,研究的都是语言的动态功能。
这个跟CSS的装饰器看起来一个意思。都属于一整一大片,全部向前看。
我是用python时需要用到什么,就现去搞明白。
大佬,这个装饰器有“层叠”的性质么?能像金字塔式嵌套么?
紧跟大佬
哈哈 各种设计模式
刚做完一个策略模式的PPT
不敢当不敢当
哈哈 看来你对这门语言还有待深入呀
这个不太一样吧
CSS的装饰器和我这里说的应该是两回事
仔细看看,明白了。@就是个语法糖,用来简写的。这个功能一般是用于在各个模块加日志记录、登录确认之类功能的。
可以这样理解
修改了一下,再说的透彻一些:
Python 2.7.16 (v2.7.16:413a49145e, Mar 4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> registry = [] >>> def register(func): ... print('--> register(%s)' % func) ... registry.append(func) ... def new_func(): ... print('call> register(%s)' % func) ... func() ... return new_func ... >>> @register ... def f1(): ... print('running f1()') ... --> register() >>> @register ... def f2(): ... print('running f2()') ... --> register() >>> def f3(): ... print('running f3()') ... >>> def main(): ... print('running main()') ... print('registry ->', registry) ... f1() ... f2() ... f3() ... >>> main() running main() ('registry ->', [, ]) call> register() running f1() call> register() running f2() running f3() >>> >>>
编辑器不给力,发个截图吧。
>>> def deco(func):
... def inner():
... print('running inner()')
... return inner ➊
...
>>> @deco
... def target(): ➋
... print('running target()')
...
>>> target() ➌
running inner()
>>> target ➍
.inner at 0x10063b598>
➊ deco 返回 inner 函数对象。
➋ 使用 deco 装饰 target。
➌ 调用被装饰的 target 其实会运行 inner。
➍ 审查对象,发现 target 现在是 inner 的引用。
严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做元编程(在运行时改变程序的行为)时。 综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时立即执行。
装饰器有个特点 它们在被装饰的函数定义之后立即运行
通常是在导入时(即 Python 加载模块时)Python执行装饰器
registry = [] ➊
def register(func): ➋
print('running register(%s)' % func) ➌
registry.append(func) ➍
return func ➎
@register ➏
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
def f3(): ➐
print('running f3()')
def main(): ➑
print('running main()')
print('registry ->', registry)
f1()
f2()
f3()
if __name__=='__main__':
main() ➒
➊ registry 保存被 @register 装饰的函数引用。
➋ register 的参数是一个函数。
➌ 为了演示,显示被装饰的函数。
➍ 把 func 存入 registry。
➎ 返回 func:必须返回函数;这里返回的函数与通过参数传入的一样。
➏ f1 和 f2 被 @register 装饰。
➐ f3 没有装饰。
➑ main 显示 registry,然后调用 f1()、f2() 和 f3()。
➒ 只有把 registration.py 当作脚本运行时才调用 main()。
把 registration.py 当作脚本运行得到的输出如下:
$ python3 registration.py
running register()
running register()
running main()
registry -> [, ]
running f1()
running f2()
running f3()
做大型的项目呢吧,研究的都是语言的动态功能。
这个跟CSS的装饰器看起来一个意思。都属于一整一大片,全部向前看。
我是用python时需要用到什么,就现去搞明白。
大佬,这个装饰器有“层叠”的性质么?能像金字塔式嵌套么?
紧跟大佬
哈哈 各种设计模式
刚做完一个策略模式的PPT
不敢当不敢当
哈哈 看来你对这门语言还有待深入呀
这个不太一样吧
CSS的装饰器和我这里说的应该是两回事
仔细看看,明白了。@就是个语法糖,用来简写的。这个功能一般是用于在各个模块加日志记录、登录确认之类功能的。
可以这样理解
修改了一下,再说的透彻一些:
编辑器不给力,发个截图吧。