我正在寻找有关如何存储在对象内部的对象上调用的方法的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'
现在,我要寻找的是一种通用解决方案,可以捕获和存储on上调用的任何类型的函数Catcher
,而无需实现所有重载和其他情况。如您所见,我还想存储方法的属性值(如果有多个,则 存储 在列表中? )。
提前致谢!
元类在这里无济于事;尽管会根据当前对象的类型(例如实例的类)查找特殊方法,__getattribute__
或者__getattr__
在这样做时不对其进行查询(可能是因为它们本身就是特殊方法)。因此,要捕获
所有 dunder方法,您必须全部创建它们。
你可以得到所有的一个相当不错的清单 运营商
的特殊方法(__pow__
,__gt__
等)通过枚举operator
模块:
import operator
operator_hooks = [name for name in dir(operator) if name.startswith('__') and name.endswith('__')]
有了该列表,类装饰器可以是:
def instrument_operator_hooks(cls):
def add_hook(name):
operator_func = getattr(operator, name.strip('_'), None)
existing = getattr(cls, name, None)
def op_hook(self, *args, **kw):
print "Hooking into {}".format(name)
self._function = operator_func
self._params = (args, kw)
if existing is not None:
return existing(self, *args, **kw)
raise AttributeError(name)
try:
setattr(cls, name, op_hook)
except (AttributeError, TypeError):
pass # skip __name__ and __doc__ and the like
for hook_name in operator_hooks:
add_hook(hook_name)
return cls
然后将其应用于您的班级:
@instrument_operator_hooks
class CatchAll(object):
pass
演示:
>>> c = CatchAll()
>>> c ** 2
Hooking into __pow__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 11, in op_hook
AttributeError: __pow__
>>> c._function
<built-in function pow>
>>> c._params
((2,), {})
因此,即使我们的类没有__pow__
明确定义,我们仍然会迷上它。
我在做一个数独游戏,我有“cell”类型的9x9对象(类扩展了JTextField),我想防止在用户不符合游戏规则的情况下关注其他JTextField对象——他的输入(1-9)不会在同一行或同一个“块”。要做到这一点,我需要知道他关注的具体对象。 我正在考虑这样做的一种方法是使用DocumentFilter。我已经将输入过滤为数字和1长度,但我不知道如何获取他关注的“单元格”对象,我很确定Docu
问题内容: 我正在研究启动多个进程和数据库连接的python脚本。我不时地想用信号杀死脚本,我想进行一些清理。 在Perl中,我可以这样做: 如何在Python中做类似的事情? 问题答案: 用以下方式注册你的处理程序: 代码改编自此处。
下面是我要为其创建测试的类和方法: 具体地说,我希望模拟getAnalytics.getAll(),这样它就会返回一个我已经定义的字符串。而不是方法执行它的任务。这是我的代码:
问题内容: 我的模板看不到从Spring传递过来的对象。 我的代码: Contoller的代码: 主模板的代码: 片段的代码: 结果,我看到了方法调用的代码,例如 为什么thymeleaf不调用方法,而是在输出页上打印此文本?在http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html的示例中,方法调用具有相同的语法,例如 相同的代
问题内容: 我有一个JAR文件,其中包含使用外部模型文件的API。我想将模型文件包含在JAR本身中,以便其他开发人员更容易使用。该API仅接受File对象,有什么方法可以做到这一点?我已经尝试了以下方法,但它们失败了: 使用class.getResourceAsStream()。如果API接受了InputStream,这将起作用。 解析类路径并尝试从条目构建(JAR将显示为app.jar) 我想一
问题内容: Python:如何在被调用方法中获取调用者的方法名称? 假设我有2种方法: 如果我不想对method1进行任何更改,如何在method2中获取调用方的名称(在本示例中,名称为method1)? 问题答案: 和其他相关功能可以帮助: 该自省旨在帮助调试和开发;建议不要出于生产功能目的而依赖它。