1. 程式人生 > >python 裝飾器的基本原理

python 裝飾器的基本原理

#裝飾器的本質 就是函式,功能是為其他函式新增附加功能
#原則:
# 不修改被修飾函式的原始碼,不修改被修飾函式的呼叫方式
# import time
# def cal(l):
#     start_time=time.time()
#     res=0
#     for i in l:
#         time .sleep(0.1)
#         res+=i
#     stop_time=time.time()
#     print('函式的執行時間是%s'%(stop_time-start_time))
#     return res
# print(cal(range(100)))
                               #裝飾器=高階函式+函式巢狀+閉包
import time
def foo():
    time.sleep(0.2)
    print('彭亮')
#不修改原始碼 不修改foo呼叫方式
def timer (func):
    start_time=time.time()
    func()
    stop_time=time.time()
    print('執行時間%s'%(stop_time-start_time))
    return func
foo=timer(foo)
foo()
#裝飾器本身就是函式
# 裝飾器就是閉包函式的一種應用場景
# 二 什麼是裝飾器
#
# 裝飾器他人的器具,本身可以是任意可呼叫物件,被裝飾者也可以是任意可呼叫物件。
# 強調裝飾器的原則:1 不修改被裝飾物件的原始碼 2 不修改被裝飾物件的呼叫方式
# 裝飾器的目標:在遵循1和2的前提下,為被裝飾物件新增上新功能
def deco(obj):
    print('===========',obj)
    obj.x=1
    obj.y=2
    obj.z=3
    return obj
### @deco是全域性變數
# @deco  # 裝飾器的原理就是 運行了deco 目的是:test=deco(test)   deco把test傳入進去同時得到一個(返回值 傳給func)  再賦給test
# def test():
#     print('test函式執行')
# print("+"*20)
# @deco  #就是相當於 Foo=deco(Foo)
# class Foo:
#     pass
# print(Foo.__dict__)
 #  @ 不僅可以在函式前面加  還可以在類前面加
print("-------------------"*30)
# @deco
def test(): # 一切皆物件 test 也是物件
    print('test')
test.x=1
test.y=2
print(test.__dict__)