【问题标题】:When doing function chaining in python, is there a way to refer to the "current" object?在 python 中进行函数链接时,有没有办法引用“当前”对象?
【发布时间】:2017-02-07 23:26:54
【问题描述】:

假设我获得了以下课程:

class foo(object):

    def __init__(self, int):
        self.count = int

    def increment(self, int):
        return foo(int + 1)

    def decrement(self, int):
        return foo(int - 1)

我的目标是将函数调用链接在一起以达到我想要的结果,而不必将每个对象分配给一个变量。例如,我知道我可以这样做:

obj = foo(0)
obj = obj.increment(obj.count)
obj = obj.decrement(obj.count)
obj = obj.increment(obj.count)
obj = obj.decrement(obj.count)
print obj.count
0

但我希望能够做到这一点:

finalcount = obj(0).increment(?.count).decrement(?.count)

但我不知道是否有什么可以代替? 来引用正在调用方法的对象,因为该对象尚未被分配名称。

【问题讨论】:

  • 只是return self 在每个方法的末尾。短语“流畅的界面”可能有助于您的研究。
  • @jonrsharpe 好吧,这在创建新实例的 OP 示例中并不完全有效。
  • 这个类的所有方法实际上都没有对它的实例变量做任何事情。你确定incrementdecrement 应该对增加什么而不是增加self.count 进行争论吗?你确定他们应该创建一个修改(并可能返回)self 的新对象实例吗?
  • @user2357112 如果类设计不好,那么请记住它。一般来说,如果您尝试调用的函数确实需要一个参数,并且您要传递的参数恰好是该类的成员,这可能吗?如果答案是否定的,我可以接受。我只是想知道。

标签: python


【解决方案1】:

您的对象在您当前的代码中并没有真正贡献任何东西。注意你的类中的方法如何不引用任何对象状态——它们从不使用self。最好完全省略 int 参数,而改用 self.count

class foo(object):
    def __init__(self, int):
        self.count = int

    def increment(self):
        return foo(self.count + 1)

    def decrement(self):
        return foo(self.count - 1)

那么,你想写的就变成了这样:

finalcount = foo(0).increment().decrement()

但是,要回答您最初的问题,无法引用调用链中的“当前”对象。如果你想引用一个中间对象,你必须把它赋给一个变量。

【讨论】:

  • 我真的只是拼凑了一个愚蠢的类来问真正的问题:是否可以引用已作为链的一部分创建的对象。我可以进入我想到的特定pandas.dataframe 问题,但我只是好奇能够在一般情况下执行类似这样的操作,其中函数确实需要一个参数,而您想要使用的参数是一个成员类的。
  • 我的最后一段解决了您的问题,无论激励示例的质量如何。
  • 谢谢罗伯!这真的是我想知道的。知道了这一点,我可以就我遇到的具体问题提出不同的问题,只是在处理它时我对这个话题感到好奇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多