python中類作為裝飾器

2021-08-20 22:52:59 字數 2166 閱讀 1164

'''

class test(object):

print("---------test---------")

t = test()

t()# traceback (most recent call last):

# file "f:/python專案/09day/03python高階/01類作為裝飾器.py", line 6, in

# t()

# typeerror: 'test' object is not callable

#如果t乙個函式,可以直接使用t()來進行呼叫,

#t是乙個物件,怎麼來呼叫物件呢?

#沒有重寫call方法,不能直接呼叫,直接呼叫會初上上面的報錯

'''#重寫了__call__方法,類的物件就能夠被呼叫,直接使用t()來呼叫類,並列印__call__方法裡面的內容

class test(object):

print("--------test1----------")

def

__call__(self

, *args, **kwargs):

print("---------test---------") #注意一點,__call__方法裡面的是最後執行。

def

eat(self):

print("-----------eat-------------")

print("---------test2---------")

t = test()

t()

執行結果:
d:\python3.6\pythonw.exe f:/python專案/09day/03python高階/01類作為裝飾器.py

--------test1----------

---------test2---------

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

process finished with exit code 0

類做為裝飾器:
class test(object):

def

__init__(self

,func):

print("-------初始化-------")

print("func name is %s" %func.__name__)

self.__func = func #類的私有屬性self.__func也指向了test1函式的記憶體位址。

def

__call__(self

, *args, **kwargs): #test1 = test(test1) #呼叫類的物件。就會呼叫call方法。

print("------裝飾器中的功能-------")

self.__func() #self.__func指向了函式test1的記憶體位址。這句話相當於執行test1()函式。

#使用類作為裝飾器,需要重寫call方法,沒有呼叫test1()方法的時候,執行**得到下面的結果

# -------初始化-------

# func name is test1

@test

#相當於 test1 = test(test1) 也相當於func指向了下面函式test1的名字, 前面的test1指向了 test()這個物件。

# 呼叫test1物件的時候相當於呼叫類方法test(),呼叫類方法必呼叫__call方法,呼叫call方法的時候,先執行 print("------裝飾器中的功能-------")

#然後在執行self.__func() ,因為self.__func函式指向的是test1函式,test1()相當於執行self.__func().

def

test1():

print("----test1---------")

test1() #呼叫test1

d:\python3.6\pythonw.exe f:/python專案/09day/03python高階/02類作為裝飾器.py

-------初始化-------

func name is test1

------裝飾器中的功能-------

----test1---------

process finished with exit code 0

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...

python 類裝飾器

defouter x definner 函式巢狀 returnx 跨域訪問,引用了外部變數x returninner 函式作為返回值 closure outer 外部變數 函式作為變數賦給closure print closure 執行閉包 實際上,類也可以作為裝飾器。類裝飾器主要依賴於函式 cal...