2017-02-07 30 views
2

假设我得到以下类:在python中进行函数链接时,有没有办法引用“当前”对象?

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) 

,但我不知道是否有东西,我可以把?的位置指向正在调用方法的对象,因为该对象尚未被分配名称。

+0

只是在每个方法结束时返回self。短语*“流利的界面”*可能有助于您的研究。 – jonrsharpe

+0

@jonrsharpe那么,这将不会在OP的例子中创建新实例。 – wim

+1

这个类的方法实际上没有对它的实例变量做任何事情。你确定'increment'和'decrement'应该为增加的内容提供一个参数,而不是递增'self.count'?你确定他们应该创建一个修改(也许是返回)'self'的新对象实例吗? – user2357112

回答

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() 

不过,要回答你原来的问题,不存在方式来引用调用链中的“当前”对象。如果你想引用一个中间对象,你必须将它分配给一个变量。

+0

我真的只是扔在一起愚蠢的类来问真正的问题:是否有可能引用已创建为链条的一部分的对象。我可以深入到具体的'pandas.dataframe'问题中,但是我只是对能够做这样的事情感到好奇,一般情况下函数需要参数,而您要使用的参数是该班的一名成员。 – JHixson

+0

无论激励示例的质量如何,我的最后一段都提到了您的问题。 –

+0

谢谢Rob!这真的就是我想知道的。知道这一点,我可以去问一个关于我遇到的具体问题的不同问题,只是在工作时我对这个话题感到好奇。 – JHixson

0

这将是这个样子:

class Foo(object): 

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

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

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

然而,这不是很Python的,我不推荐的模式。调用者已经有一个引用(他们必须,为了调用),所以他们不需要返回给他们的另一个引用。

通常在Python中,如果方法变异数据,它不应该返回任何东西。这个陈述的反面是:如果一个方法返回一个值,那么它不应该改变数据。当然,这些只是Pythonic风格的指导方针,但是在设计界面时,最好不要让开发人员的行为与他们的期望不同。

相关问题