一.装饰器:(本质上是一个闭包)
作用:(给一个现有的函数扩展功能)
import time
import random
def sourceFunc():
print("原始函数开始...")
time.sleep(random.random())
print("原始函数结束...")
# 给原始函数扩展功能
# def expendFunc():
# print("原始函数前扩展的功能...")
# sourceFunc()
# print("原始函数后扩展的功能...")
#
# expendFunc()
# 让expendFunc函数使用于多个函数
# def expendFunc(fun):
# print("原始函数前扩展的功能...")
# fun()
# print("原始函数后扩展的功能...")
#
# expendFunc(sourceFunc)
# 给原始函数增加功能,但不改变原始函数的调用方式
# def rewriteSource(fun):
# def expendFunc():
# print("原始函数前扩展的功能...")
# fun()
# print("原始函数后扩展的功能...")
# return expendFunc
#
# sourceFunc = rewriteSource(sourceFunc)
# sourceFunc()
#------------以上即是装饰器的形成过程------------------------
# def rewriteSource(fun):
# def expendFunc():
# print("原始函数前扩展的功能...")
# fun()
# print("原始函数后扩展的功能...")
# return expendFunc
#
# @rewriteSource # 语法糖:替代sourceFunc = rewriteSource(sourceFunc)
# def sourceFunc():
# print("原始函数开始...")
# time.sleep(random.random())
# print("原始函数结束...")
#
# sourceFunc()
# 如果sourceFunc函数带返回值,装饰器如何获取
# def rewriteSource(fun):
# def expendFunc():
# print("原始函数前扩展的功能...")
# ret = fun()
# print("原始函数后扩展的功能...")
# return ret
# return expendFunc
#
# @rewriteSource # 语法糖:替代sourceFunc = rewriteSource(sourceFunc)
# def sourceFunc():
# print("原始函数开始...")
# time.sleep(random.random())
# print("原始函数结束...")
# return "原始函数的返回值"
# res = sourceFunc()
# print(res)
# 如果原始函数还带有一个参数,装饰器该如何传入
# def rewriteSource(fun):
# def expendFunc(arg):
# print("原始函数前扩展的功能...")
# ret = fun(arg)
# print("原始函数后扩展的功能...")
# return ret
# return expendFunc
#
# @rewriteSource # 语法糖:替代sourceFunc = rewriteSource(sourceFunc)
# def sourceFunc(arg):
# print("原始函数开始...")
# time.sleep(random.random())
# print("这是原始函数的参数:{}".format(arg))
# print("原始函数结束...")
# return "原始函数的返回值"
# res = sourceFunc('我就是传入的参数')
# print(res)
# 原始函数带任意数参数
# def rewriteSource(fun):
# def expendFunc(*args,**kwargs):
# print("原始函数前扩展的功能...")
# ret = fun(*args,**kwargs)
# print("原始函数后扩展的功能...")
# return ret
# return expendFunc
#
# @rewriteSource # 语法糖:替代sourceFunc = rewriteSource(sourceFunc)
# def sourceFunc(*args,**kwargs):
# print("原始函数开始...")
# time.sleep(random.random())
# print("这是原始函数的参数组--args:{};kwargs:{}".format(args,kwargs))
# print("原始函数结束...")
# return "原始函数的返回值"
# res = sourceFunc('位置1','位置2','位置3',name='张三',age=18,job='teacher')
# print(res)
二.开发原则:(开放封闭原则)
开放:对扩展是开放的
代码功能越多越强大,扩展代码段的功能是不变的追求
封闭:对修改时封闭的
代码可能在多个地方被调用,一但原代码被修改,每个被调用的
地方均受到影响,牵一发而动全身,影响范围不可控制