【问题标题】:Apply multiple methods to a single object?将多个方法应用于单个对象?
【发布时间】:2019-09-14 05:54:12
【问题描述】:

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

我找到了一个“硬编码”解决方案,方法是创建一个目前不是很有动力的课程:call list of function using list comprehension

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

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

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

因为appendattrs 默认不是静态函数,而是如上所示的'点'。

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

[强烈建议编辑]

更新

在 [122] 中:getattr?文档字符串:getattr(object, name[, default]) -> 价值

从对象中获取命名属性; getattr(x, 'y') 等价于 x.y.当给定一个默认参数时,它会在 属性不存在;没有它,就会引发异常 案子。类型:builtin_function_or_method getattr():属性名必须是字符串 只有2 有效。这是得到的“结果”(不是硬编码) 有关“模型”作为对象的更多信息。

【问题讨论】:

  • 你可以做result = [f() for f in [obj.append, obj.attrs]]result = [getattr(obj, f)() for f in ["append", "attrs"]]
  • 我试过了,结果我更新了。好像漏掉了属性,还没弄明白。

标签: python


【解决方案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)()

【讨论】:

  • 我写了一个这样的方法调用程序,但 getattr 需要字符串,而不是我指出的“未定义的函数名”。当我使用这些函数时,对象有时会返回 Dict。 'Object' 是来自 BeautifulSoup 调用 html.parser 的解析 HTML。
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多