装饰器
Posted outofcontrol
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
# _*_ coding: utf-8 _*_
# 1. 什么是装饰器?
#
# 装饰器本身可以是任意可调用的对象=>函数
# 被装饰的对象也可以是任意可调用的对象=>函数
#
# 强调装饰器的原则:
# 不修改被装饰对象的源代码
# 不修改被装饰对象的调用方式
#
# 装饰器的目标:在遵循装饰器的原则的前提下,为被装饰对象添加上新功能
#
# 2. 为何要用装饰器?
# 开放封闭原则:对修改封闭,对拓展开放
#
# 对修改封闭:
# 不修改被装饰对象的源代码
# 不修改被装饰对象的调用方式
# 对拓展开放:
# 遵循对修改封闭,可以添加新功能
#
# 装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能
#
# 3. 怎么用装饰器
import time
# 调用python自带内置函数---》》全局作用域
def original(): # 原函数
print(‘Original function‘)
time.sleep(1)
def external(original_func):
# original_func = original的内存地址
def alter():
start = time.time()
original_func()
# 局部作用域找值 alter()中没有
# 去外层external---alter这一层中找到
# 这时候original_func()等于original()
stop = time.time()
print(‘Run time is %s‘ %(stop - start))
return alter
# 返回alter的内存地址
# 可以理解为把alter这个函数运行结果返回给了external的运行结果
original = external(original)
# 相当于alter(original的内存地址)
# original_func = original的内存地址
# original(原函数名) 相当于重新赋值了 代替旧函数
original()
# 此时调用过程
# (重新赋值过的)original()-------》
# external(original_func = (原函数内存地址)original)------》
# 收到alter的返回值(alter整个函数体)-------》
# 运行函数体----》original_func()=(原函数内存地址)original----》
# 函数体运行完毕 此时(原函数original)功能没有改变 但从调用结果来看
# 重新赋值过内存地址的original() 功能上发生改变但不影响(原函数original)
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章