python 高階 類當作裝飾器

2022-02-01 19:19:28 字數 898 閱讀 1415

類在建立物件時,會呼叫 __init__ 初始化一些東西 , 然後 如果類中定義了 __call__ 方法,可以直接用  物件()  這種方法呼叫,所以可以用類來裝飾函式:

class test(object

): def __init__(self, func):

print(

'----裝飾-----')

print(

'func name is %s

' %func.__name__)

self.__func =func

def __call__(self, *args, **kwargs):

print(

'裝飾器中的功能')

self.__func()

@test

def test():

print(

'------test-------')

>>>----裝飾-----func name

is test

首先 @test 就是   test = test(test)  先建立了test類的乙個物件 這個時候 test 就不是指向函式了,而是乙個 test類的物件,傳進去的引數 func 才是真正的 test 函式的引用,呼叫 __init__ 方法初始化之後,就是列印出來的效果.

然後如果呼叫  test() :

>>>----裝飾-----func name 

istest

裝飾器中的功能

------test-------

因為現在 test是test類的乙個例項,所以 直接呼叫 test() 就相當於呼叫了 __call__ 方法 ,裡面實現了列印一句話 以及呼叫傳進去的 self.__func() 這個時候才執行了原本的 test 函式.

python中類當作裝飾器及其意義

裝飾器函式其實是這樣乙個介面約束,它必須接受乙個callable物件作為引數,然後返回乙個callable物件。在python中一般callable物件都是函式,但也有例外。只要某個例項物件重寫了call 方法,那麼這個物件就是callable的。不帶引數的類裝飾器class test object...

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

對帶引數的函式進行裝飾 對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件 def deco func def deco a,b print before myfunc called.ret func a,b print after myfunc calle...

python 高階篇 函式裝飾器和類裝飾器

簡單裝飾器 def my decorator func func def greet print hello world greet my decorator greet greet 輸出 hello world上述 在 python 中有更簡單 更優雅的表示 def my decorator fu...