所以我在某处看到了这段代码。
1]那么为什么我们在每种方法结束时都会回归自我?目的是什么? 它有用吗?
2]如何解释链接方法(最后一行) - doug.set_legs(4).count_legs()。sleep()。sleep()。sleep()
class pet:
number_of_legs = 0
def sleep(self):
print "zzz "
return self
def set_Legs(self, legs):
self.number_of_legs = legs
return self
def count_legs(self):
print "I have %s legs" % self.number_of_legs
return self
class dog(pet):
def bark(self):
print "Woof"
doug = dog()
doug.set_Legs(4).count_legs().sleep().sleep().sleep() # Any explanation for this chaining & how its operating particularly in this case ??
>>>I have 4 legs
ZZZ
ZZZ
ZZZ
Out[249]: <__main__.dog instance at 0x7fd5d81917e8> # Why & from where this part getting printed ??
doug.set_legs(4).count_legs().sleep().set_legs(10).count_legs().sleep().sleep()
>>>I have 4 legs
ZZZ
I have 10 legs
ZZZ
ZZZ
Out[242]: <__main__.dog instance at 0x7fd5d81917e8> # Why & from where this part getting printed ??
答案 0 :(得分:2)
这两个问题都是相关的。方法返回self,这是你正在处理的对象,这允许你链接方法,因为第一个方法的结果是你调用第二个方法的对象。
e.g。
doug = dog()
doug.set_Legs(4).count_legs().sleep()
相当于
doug = dog()
doug.set_Legs(4)
doug.count_legs()
doug.sleep()
答案 1 :(得分:2)
这是Method Chaining模式的一个例子。虽然它在Python中很常见,但如果您想对同一个对象执行多个操作,它通常很有用。因此,它最常见于jQuery编程,例如用于修改网页上的元素。
由于sleep
,set_legs
和count_legs
方法不会返回任何重要的内容,因此您也可以返回调用该方法的对象,而不是返回任何内容。
这样,如果你想在同一个对象上做其他事情,你可以将它压缩成一行代码。
解释您的代码行:
doug # the Dog object
.set_Legs(4) # call set_legs on doug, returning doug
.count_legs() # call count_legs on doug, returning doug
.sleep() # call sleep on doug, returning doug
.sleep() # call sleep on doug, returning doug
.sleep() # call sleep on doug, returning doug
最后一行是你的python解释器,它显示了函数的返回值,即doug
。你可以打电话给更多的set_legs
,count_legs
等。
以上代码相当于:
doug.set_Legs(4)
doug.count_legs()
doug.sleep()
doug.sleep()
doug.sleep()
答案 2 :(得分:1)
返回self
对方法链很有用,所以你可以做
doug.set_Legs(4).count_legs().sleep().sleep().sleep()
而不是
doug.set_Legs(4)
doug.count_legs()
doug.sleep()
doug.sleep()
doug.sleep()
这看起来不是一个非常合适的地方。当您想要将一系列转换应用于对象时,它非常有用,例如在jQuery中。
至于链接方法,
doug.set_Legs(4).count_legs().sleep().sleep().sleep()
相当于
temp = doug.set_Legs(4)
temp = temp.count_legs()
temp = temp.sleep()
temp = temp.sleep()
temp = temp.sleep()
,因为此处的所有方法都返回self
,相当于
doug.set_Legs(4)
doug.count_legs()
doug.sleep()
doug.sleep()
doug.sleep()
答案 3 :(得分:0)
1)
def sleep(self):
print "zzz "
return self
您的方法可以返回任何内容。 对于类中的方法,唯一的义务是将“self”作为第一个参数。 就这样。 您没有理由返回该对象。 你的一些函数不需要任何return语句!
def sleep(self):
print "zzz "
2)以书面方式解释:从左到右。 那些先前的回报是你能够以这种方式链接的(你在返回值上链接)。