1. 程式人生 > >用類作為裝飾器裝飾函數!

用類作為裝飾器裝飾函數!

為什麽 init 相等 初始化 UNC ron 定義 成了 初始

在python中我們可以利用一個函數作為裝飾器來裝飾另一個函數,但是裝飾器只能是函數嗎 ?當然了我們還可以使用類來作為裝飾器!

class A(object):
    def __init__(self,func):
        print(‘定義初始化函數‘)
        print(‘func name is %s‘%func.__name__)
        self.__func = func

    def __call__(self):
        print(‘call 方法作為裝起中的功能‘)
        self.__func()
        print(‘增加的功能2‘)

# @A

def B():
    print(‘這個是B是原函數‘)

# A(B)
#如果不看裝飾器的作用的話,這裏的 A(B)和上面的 @A相等作用相同,但是這裏的作用就是是裝飾器了,就只是簡單的函數調用了,所以就不會調用call方法了

這個的輸出結果是:

定義初始化函數
func name is B

註意:
這裏的為什麽會打印出B而不是A,我簡單的解釋下,
我們把A當做裝飾器調用,也就相當於調用了A這個類A(B)
這樣的話我們就傳入了參數B這個函數,所以func.name這個就是B了
這裏初始化的調用就完成了

class A(object):
    def __init__(self,func):
        print(‘定義初始化函數‘)
        print(‘func name is %s‘%func.__name__)
        self.__func = func

    def __call__(self):
        print(‘call 方法作為裝起中的功能‘)
        self.__func()
        print(‘增加的功能2‘)

@A

def B():
    print(‘這個是B是原函數‘)

# A(B)
B()

這個的輸出結果是:

定義初始化函數
func name is B
call 方法作為裝起中的功能
這個是B是原函數
增加的功能2

註:
這裏我們把類當做裝飾器了,所以他就會去調用call方法,也就自然會調用下面的方法了!

用類作為裝飾器裝飾函數!