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

作者: XperiaZ6C (真●安卓輕旗艦)   2020-08-22 09:08:09
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 09:23:00
你的意思是,每當一個 member method 被呼叫時,就要抓到是誰被呼叫嗎?如果要的效果是這樣,我目前是有想到可以透過 metaclass 去做我釐清一下你想做的事:也就是說,任何一個沒有定義在Logger class 裡的 function ‘foo’,只要透過 logger.foo() 這種方式呼叫,你就可以先透過 logger 去做你想做的事再讓那個 function 做自己的事囉?先說好了,如果要透過這種呼叫方式來達到這種功能是有點奇怪。雖然說你可以硬是透過 `__getattr__()` 讓logger 在找不到 member method 時(也就是上述的情況),去其他 scope 找你要的 function ,如 globals()。但是這樣你就要自己處理 name resolution 的問題。再來,怎麼取得 caller 的 arguments 又是另一個問題但是如果你沒有需要處理 caller arguments 的話,那上面那個問題就省了
作者: skyconquer (梅郭曲)   2020-08-22 10:27:00
我回了一篇文在底下,請參考看看。
作者: TitanEric (泰坦)   2020-08-22 10:37:00
怎麼覺得跟decorator有關
作者: gmccntzx1 (o.O)   2020-08-22 10:39:00
我是這樣覺得,但目前還不清楚原 PO 真正的問題怕變成 XY problem先給原 PO 看看這個是不是你想要的結果:https://pastebin.ubuntu.com/p/vnYCs4PxtZ/試試看這是不是你要的效果:https://pastebin.ubuntu.com/p/MjrW628M7k/但是這個做法就如同前面提到的,若你需要處理 callerarguments 的話,還要額外透過 frame 去抓資訊另一個做法是改成用 function wrapper 把每一個 rpc提供的 function 都包過一次,這種方法對於也要處理arguments 的話會比較方便,但是缺點就是一旦 wrapper太多,要轉進呼叫到實際上 rpc 的 function 也需越多層接續上面第一種方式,也可以不透過 frame 去抓 callerargumenthttps://pastebin.ubuntu.com/p/HpXBF4cNgy/(`・∀・)b
作者: azuel (Observer)   2020-08-23 18:03:00
看了這些討論之後我覺得自己好菜
作者: gmccntzx1 (o.O)   2020-08-23 20:51:00
@azuel 不用這樣說,每個人都嘛是從新手開始走起。覺得自己不足的時候,就繼續努力把能力練起來,這才是該做的事。而且說實在的,我也沒有解決了什麼高深的問題,純粹只是分享以我目前所知所能構成的解法。以後對 Python 了解更透徹後,說不定又會有更好的解法。共勉之

Links booklink

Contact Us: admin [ a t ] ucptt.com