0

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

自从我接触 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)
            )

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

4

1 回答 1

3

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

setattr(
        self,
        user_method,
        lambda call=call: self.master.query(call)
        )
于 2015-04-16T11:26:15.120 回答