我把原Po文章放在底下,方便對照。
試試我寫的程式碼, 看看有無達成你的需求。
麻煩特別注意一下註解的部份︰
******************************************************************************
def nonMemberFunc(arg):
print("nonMemberFunc is called with arg: " + str(arg))
class Logger(object):
def __getfunc__(self, func, arg):
print(func.__name__)
## 移除"func()"的括號,將傳入的func變成object並
## 呼叫其 member "__name__"
print(func)
## 移除"func()"的括號,將傳入的func變成object並
## 印出其資訊
return func(arg)
def method1(self, arg):
print("method1 is called with argument: "+str(arg) + "\n")
def method2(self, arg):
print("method2 is called with argument: "+str(arg) + "\n")
def method3(self, arg):
print("method3 is called with argument: "+str(arg) + "\n")
if __name__ == "__main__":
L1 = Logger()
L1.__getfunc__(L1.method1, "m1")
L1.__getfunc__(L1.method2, "m2")
L1.__getfunc__(L1.method1, "m3")
L1.__getfunc__(nonMemberFunc, "nonMemberFuncArg")
******************************************************************************
輸出結果:
method1
<bound method Logger.method1 of <__main__.Logger object at 0x7f0ff113b9d0>>
method1 is called with argument: m1
method2
<bound method Logger.method2 of <__main__.Logger object at 0x7f0ff113b9d0>>
method2 is called with argument: m2
method1
<bound method Logger.method1 of <__main__.Logger object at 0x7f0ff113b9d0>>
method1 is called with argument: m3
nonMemberFunc
<function nonMemberFunc at 0x7f0ff112c1f0>
nonMemberFunc is called with arg: nonMemberFuncArg
※ 引述《XperiaZ6C (索尼)》之銘言:
: Python一個很方便的功能是函數可以當作參數傳遞
: 那請問我可以在class裡面取得調用的函數物件嗎
: 例如我想做到在函數被調用前
: 可以做其他處理
: 拿print來舉例好了
: 像是下面程式碼這樣
: class Logger(object):
: def int(self, value):
: print('Call int()')
: return int(value)
: def float(self, value):
: print('Call float()')
: return float(value)
: logger = Logger()
: logger.int('123')
: logger.float('123')
: 我只知道可以用下面的方法取得函數的名稱
: class Logger(object):
: def __getattr__(self, name):
: print('Call %s()' % name)
: 但是函數物件要怎麼抓?
: 像是如果我有20個函數的話
: 那class裡面就要寫20遍
: 如果之後又需要擴充到40個函數
: 那就還要在class裡面加40個
: 有沒有什麼方法是可以把logger.func()裡的func()直接抓來用的
: 例如什麼
: class Logger(object):
: def __getfunc__(self, func, arg):
: # do something
: return func(arg)
: 之類的
: 這樣我只要定義一個函數
: 後面不過擴充幾個需要做一樣處理的函數
: 我都不需要再增加class裡面的函數數量
: 感謝
: