像java一样在python中链接的方法?

时间:2014-12-12 17:06:37

标签: java python

我依旧记得从我的Minecraft modding时代开始,在java中,你可以在一行中设置多个类变量,如下所示:

SomeBlock.hardness(0.5).isOpaque(True).blastResistance(2).etc.etc

好吧,我想知道是否有办法在python中做类似的事情。我已经尝试在python中做同样的事情,但第二个最终认为它应该修改第一个而不是原始类的返回。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:4)

是的,实际上它可以像在Java中一样完成:返回self引用。

class SomeBlock(object):
    def hardness(self, blah):
        self.hardness = blah
        return self
    def isOpaque(self, value):
        self.isOpaque = value
        return self

a = SomeBlock()
a.hardness(0.5).isOpaque(true)

答案 1 :(得分:2)

这只是一个流畅的界面,设计就是这样。它主要通过返回相同的对象来创建:

class Test:
  def setX(self, x):
    self.x = x
    return self

  def setY(self, x):
    self.y = y
    return self


 t = Test()
 t.setX(12).setY(11)

答案 2 :(得分:0)

the second one ends up thinking it is supposed to modify the return of the first one instead of the original class。是的,这是正常的Python语法。返回self不会创建特殊语法。它只是确保返回的对象是链接的正确对象。

您的初始化任务通常编码为

class SomeBlock():
    def __init__(self, hardness=None, opaque=False, blastResistance=None):
        self.hardness = hardness
        self.opaque = opaque
        self.blastResistance = blastResistance

ablock = SomeBlock(hardness=0.5, opaque=True, blastResistance=2)

由于Python不需要访问属性的方法,因此您也可以编写

ablock = SomeBlock()
ablock.hardness = 0.5
...

因此,如果方法确实返回self,那么它通常会实现更复杂的设置属性。

让方法返回同一个类的新对象更常见。例如,这是许多numpy数组方法的典型情况。 A.dot(B)返回新数组,即AB的点积的结果。 A.dot(B).dot(C)可能看起来像链接,但只是连续数组上的一系列操作。