[问题] 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