【发布时间】:2013-04-28 15:26:16
【问题描述】:
我正在寻找关于如何存储在对象内部的对象上调用的方法的 Pythonic 解决方案。
因为在 python 中,如果我想捕获例如 abs() 方法,我将重载这个运算符,例如:
Catcher(object):
def __abs__(self):
self.function = abs
c = Catcher()
abs(c) # Now c.function stores 'abs' as it was called on c
如果我想捕获一个函数,其中包含其他属性,例如pow(),我将使用它:
Catcher(object):
def __pow__(self, value):
self.function = pow
self.value = value
c = Catcher()
c ** 2 # Now c.function stores 'pow', and c.value stores '2'
现在,我正在寻找一个通用的解决方案,在不实现所有重载和其他情况的情况下捕获和存储在 Catcher 上调用的任何类型的函数。如您所见,我还想存储方法的属性值(可能在一个列表中,如果有多个?)。
提前致谢!
【问题讨论】:
-
那些不委托给 dunder 方法的函数呢?
-
你可能想看看类装饰器和元类。
-
@delnan 我猜,这些也可以,因为在我的例子中,这些函数正在寻找其他东西,一个值或一个方法来调用。
-
@morphyn 你能更具体一点吗? AFAIK 元类非常适合创建类对象,不是吗?
-
@poorsod:不,我尝试过这种方法。 Dunder 钩子在 class 上查找,而不是在实例上查找,因此需要一个元类。但是
__getattr__在这种情况下似乎没有使用。__getattribute__也没有。
标签: python oop object methods call