it-swarm.cn

从类方法“返回自我”的目的?

我在一个开源项目中遇到了这样的事情。修改实例属性的方法返回对该实例的引用。这种构造的目的是什么?

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self
46
nate c

这是允许链接。

例如:

var Car = function () {
    return {
        gas : 0,
        miles : 0,
        drive : function (d) {
            this.miles += d;
            this.gas -= d;
            return this;
        },
        fill : function (g) {
            this.gas += g;
            return this;
        },
    };
}

现在您可以说:

var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;
66
Josh K

正如@Lie Ryan和@Frank Shearar提到的那样,这被称为“流畅的界面”,但是这种模式已经存在了很长时间了。

该模式的有争议的部分是,在OO中,您具有可变状态,因此void方法具有隐含的返回值this,即具有更新状态的对象是返回值的一种。

因此,在具有可变状态的OO)语言中,这两个或多或少是等效的:

a.doA()
a.doB()
a.doC()

...相对于

a.doA().doB().doC()

因此,我听说过去的人们会拒绝流畅的界面,因为他们喜欢第一种形式。我听说过的“流畅接口”的另一个名字是“火车残骸”;)

我之所以说“差不多”,是因为流畅的界面会增加皱纹。他们不必“退货”。他们可以“重获新生”。这是在OO中获得不可变对象的一种方式。

因此,您可以拥有一个能做到这一点的类(伪代码)

function doA():
    return new A(value + 1)

function doB():
    return new A(value * 2)

function doC():
    return new A(sqrt(value))

现在,每个方法都返回一个全新的对象,而初始对象保持不变。这是一种无需更改代码即可进入不可变对象的方法。

10
Rob

大多数语言都知道“返回自我”的惯用语,如果不在一行中使用它,则将其忽略。但是值得注意的是,在Python中,函数默认返回None

当我在CS学校时,我的老师对功能,过程,例程和方法之间的区别进行了巨大处理;机械铅笔在我手中变得很热,从而解决了许多有关抽筋的论文问题。

可以说,返回self是确定类方法的权威OO方法,但是Python允许多个返回值,元组,列表,对象,基元或None。

正如他们所说,链接只是将最后一个操作的答案放到下一个操作中,并且Python的运行时可以优化这种情况。列表推导是其内置形式。 (很强大!)

因此,在_Python中,每个方法或函数都返回值并不重要,这就是为什么默认值为None的原因。

有一种流派认为,程序中的每个动作都应将其成功,失败或结果报告给调用上下文或对象,但是在这里没有谈论DOD ADA要求。如果您需要从方法中获取反馈,请继续执行或不执行,但请尝试保持一致。

如果某个方法可能失败,则应返回成功或失败或引发要处理的异常。

一个警告是,如果使用return self惯用语,Python将允许您将所有方法分配给变量,并且您可能会认为实际上是在获取数据结果或列表时,就可以得到对象。

当您尝试执行此操作时,类型限制语言会尖叫,大喊和打断,但解释性语言(Python,Lua,LISP)更具动态性。

8
Chris Reid

在Smalltalk中,每个未显式返回内容的方法都具有隐式的“返回自身”。

这是因为(a)使每个方法都返回某些内容会使计算模型更加统一,并且(b)使方法返回self很有用。 Josh K给出了一个很好的例子。

4
Frank Shearar

返回对象的优点(return self

  • 例:

    print(foo.modify1().modify2())
    
    # instaed of
    foo.modify1()
    foo.modify2()
    print(foo)
    
  • 我认为编程社区中更流行的风格。

修改对象的优点(没有return self

  • 可以将return用于其他目的。
  • Guido van Rossum这种风格的认可 (我不同意他的说法)。
  • Python community(我认为)。
  • 默认(较少的源代码)。
2
xged