我依旧记得从我的Minecraft modding时代开始,在java中,你可以在一行中设置多个类变量,如下所示:
SomeBlock.hardness(0.5).isOpaque(True).blastResistance(2).etc.etc
好吧,我想知道是否有办法在python中做类似的事情。我已经尝试在python中做同样的事情,但第二个最终认为它应该修改第一个而不是原始类的返回。
有办法做到这一点吗?
答案 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)
返回新数组,即A
和B
的点积的结果。 A.dot(B).dot(C)
可能看起来像链接,但只是连续数组上的一系列操作。