Re: [問題] function物件可以透過class呼叫嗎

作者: skyconquer (梅郭曲)   2020-08-22 10:27:06
我把原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裡面的函數數量
: 感謝
:
作者: gmccntzx1 (o.O)   2020-08-22 10:33:00
痾,這樣並沒有達到原 PO 要的那種呼叫方式呀從他的回文來看,要的呼叫方式應該是 `logger.func()`但是那個 `func` 並不在 logger 內你可以看上一篇我貼的那個,不過還是等原 PO 說明吧對,我對後來回文的理解是這樣只是這種做法很少見,所以我才想說等原 PO 說明他實際上想做什麼功能一般來說也會用類似你這種的方式或前篇 TitanEric 提到的 decorator 去做,因為這樣也能處理 caller argument
作者: XperiaZ6C (真●安卓輕旗艦)   2020-08-22 11:55:00
拍謝,我好像整個會錯意了,有更新在原文

Links booklink

Contact Us: admin [ a t ] ucptt.com