python高階裝飾器 Python裝飾器高階

2021-10-11 13:01:56 字數 3722 閱讀 6037

對帶引數的函式進行裝飾

'''對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件'''

def deco(func):

def _deco(a, b):

print("before myfunc() called.")

ret = func(a, b)

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

return ret

return _deco

@deco

def myfunc(a, b):

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

return a + b

myfunc(1, 2)

myfunc(3, 4)

對引數數量不確定的函式進行裝飾

'''對引數數量不確定的函式進行裝飾,引數用(*args, **kwargs),自動適應變參和命名引數'''

def deco(func):

def _deco(*args, **kwargs):

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

ret = func(*args, **kwargs)

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

return ret

return _deco

@deco

def myfunc(a, b):

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

return a+b

@deco

def myfunc2(a, b, c):

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

return a+b+c

myfunc(1, 2)

myfunc(3, 4)

myfunc2(1, 2, 3)

myfunc2(3, 4, 5)

讓裝飾器帶引數

'''讓裝飾器帶引數,相比在外層多了一層包裝。裝飾函式名實際上應更有意義些'''

def deco(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")

def myfunc():

print(" myfunc() called.")

@deco("module2")

def myfunc2():

print(" myfunc2() called.")

myfunc()

myfunc2()

讓裝飾器帶 類 引數

'''裝飾器帶類引數'''

class locker:

def __init__(self):

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

@staticmethod

def acquire():

print("locker.acquire() called.(這是靜態方法)")

@staticmethod

def release():

print("  locker.release() called.(不需要物件例項)")

def deco(cls):

'''cls 必須實現acquire和release靜態方法'''

def _deco(func):

def __deco():

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

cls.acquire()

try:

return func()

finally:

cls.release()

return __deco

return _deco

@deco(locker)

def myfunc():

print(" myfunc() called.")

myfunc()

myfunc()

裝飾器帶類引數,並分拆公共類到其他py檔案中,同時演示了對乙個函式應用多個裝飾器

class mylocker:

def __init__(self):

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

@staticmethod

def acquire():

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

@staticmethod

def unlock():

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

class lockerex(mylocker):

@staticmethod

def acquire():

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

@staticmethod

def unlock():

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

def lockhelper(cls):

'''cls 必須實現acquire和release靜態方法'''

def _deco(func):

def __deco(*args, **kwargs):

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

cls.acquire()

try:

return func(*args, **kwargs)

finally:

cls.unlock()

return __deco

return _deco

'''裝飾器帶類引數,並分拆公共類到其他py檔案中同時演示了對乙個函式應用多個裝飾器'''

from mylocker import *

class example:

@lockhelper(mylocker)

def myfunc(self):

print(" myfunc() called.")

@lockhelper(mylocker)

@lockhelper(lockerex)

def myfunc2(self, a, b):

print(" myfunc2() called.")

return a + b

if __name__=="__main__":

a = example()

a.myfunc()

print(a.myfunc())

print(a.myfunc2(1, 2))

print(a.myfunc2(3, 4))

其他學習連線

1. python裝飾器學習

2. python裝飾器與面向切面程式設計

python高階 裝飾器

1.1 裝飾器 裝飾器的作用 在不改變原函式的情況下給函式增加功能 裝飾器由閉包和語法糖組成 1.2 閉包 閉包特點 外部函式巢狀內部函式 內部函式可以訪問並且儲存外部函式的變數 外部函式返回內部函式的引用 有以上三個特點的函式就稱為閉包 閉包的例子 def func1 a def func2 b ...

python高階 裝飾器

1.1 裝飾器 裝飾器的作用 在不改變原函式的情況下給函式增加功能 裝飾器由閉包和語法糖組成 1.2 閉包 閉包特點 外部函式巢狀內部函式 內部函式可以訪問並且儲存外部函式的變數 外部函式返回內部函式的引用 有以上三個特點的函式就稱為閉包 閉包的例子 def func1 a def func2 b ...

python高階 裝飾器

1.閉包 簡單理解 閉包就是多層函式的巢狀,外層函式的返回值是內層函式的引用。def out func n num 100 def in fucn args,kwargs nonlocal num if n 2 0 裡面沒有修改num的值,直接使用可以,如果變成 num n 則會報錯,因此需要使用前...