将多个方法应用于单个对象?

时间:2019-04-24 20:57:12

标签: python

将输出保存在数据结构中以进行事后检查。这些方法返回字符串(解析或选择HTML,它们不修改对象)。

我通过创建一个目前尚不太积极的类找到了一个“硬编码”解决方案:call list of function using list comprehension

[也许另一个用于检查库的库将是一个极端。我试图在Python源代码中打印一些内容,但是它没有服从我。似乎另一个实例正在运行]

我已经尝试过这种语法(不可能):

result = [obj.f() for f in [append, attrs]] 

因为appendattrs在默认情况下不是静态函数,而是如上所示的“点分”。

目标只是对所有obj方法的简单检查。

[强烈建议编辑]

更新

  

在[122]中:getattr? Docstring:getattr(对象,名称[,默认])->   值

     

从对象获取命名属性; getattr(x,'y')等效于   x.y.给出默认参数后,当   属性不存在;没有它,就会引发一个例外   案件。类型:builtin_function_or_method   enter image description here   getattr():属性名称必须为字符串   enter image description here   仅2有效。这是获得的“结果”(而不是对其进行硬编码)   enter image description here   有关“模型”作为对象的更多信息。

1 个答案:

答案 0 :(得分:1)

您需要绑定的方法:

result = [f() for f in [obj.append, obj.attrs]]

或通过getattr进行动态属性查找:

result = [getattr(obj, m)() for m in ["append", "attrs"]]

如果您打算对许多对象执行此操作,则可能要使用operator.methodcaller

methods = [methodcaller(m) for m in ["append", "attrs"]]
results_for_obj_a = [f(obj_a) for f in methods]
results_for_obj_b = [f(obj_b) for f in methods]
# etc.

methodcaller是一种抽象方法,可以从任何特定对象中调用方法。

methodcaller(method_name)(obj) == getattr(obj, method_name)()