【问题标题】:Python dynamic attribute value bind to method [duplicate]Python动态属性值绑定到方法[重复]
【发布时间】:2015-04-16 11:18:36
【问题描述】:

在这里阅读了几篇文章后,我仍然对使用函数作为值来实现类动态属性的正确方法感到有些困惑。

我接触 python 已经有一段时间了,现在我有点卡住了。

我有以下课程:

class RunkeeperUser(object):

    def __init__(self, master):
        self.master = master
        # Get the user methods and set the attributes
        for user_method, call in self.master.query('user').iteritems():
            # Should not get the value but bind a method
            setattr(
                self,
                user_method,
                self.master.query(call)
            )

    def get_user_id(self):
        return self.user_id


    def query(self, call):
        return self.master(call)

现在您可以在设置属性时看到它直接执行 self.master.query(call) 并且在访问属性时已经有结果。

问题是我怎样才能使这个属性值在运行时动态化并且尚未执行?

我试过了:

setattr(
                self,
                user_method,
                lambda: self.master.query(call)
            )

但由于某种原因,这并不能很好地工作。有任何帮助/指导或最佳原则来实现所描述的结果吗?

【问题讨论】:

  • 您能否详细说明“效果不佳”?该函数不会被调用吗?你有没有遇到异常,如果有,回溯是什么?
  • @user4815162342 不包含正确的结果。我认为它包含与第一个示例无关的内容。这是一个 api 调用,所以如果我这样做,第一个实现例如:user.profile 工作正常并且具有正确的数据,但使用 lambda 它发布最后一个 dict 调用左右。我也很困惑。对不起。
  • @brunodesthuilliers 一定很有趣。还有runkeeper。感谢尽快检查和报告
  • 是的。请关闭此问题!

标签: python python-2.7 dynamic-attributes


【解决方案1】:

这是一个众所周知的问题。您必须在 lambda 中绑定参数的当前值,即:

setattr(
        self,
        user_method,
        lambda call=call: self.master.query(call)
        )

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2013-08-17
    • 2013-05-04
    • 2018-12-21
    • 2021-07-23
    • 2023-04-05
    • 2010-10-30
    相关资源
    最近更新 更多