0

所以我在某处看到了这段代码。

1] 那么为什么我们在每个方法结束时都返回 self 呢?它的目的是什么?

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 ??
4

4 回答 4

2

这两个问题是相关的。这些方法返回 self ,这是您正在处理的对象,这允许您链接方法,因为第一个方法的结果是您调用第二个方法的对象。

例如

doug = dog()
doug.set_Legs(4).count_legs().sleep()

相当于

doug = dog()
doug.set_Legs(4)
doug.count_legs()
doug.sleep()
于 2013-08-29T07:56:39.390 回答
2

这是方法链模式的一个示例。虽然它在 Python 中并不常见,但如果您想对同一个对象执行多个操作,它通常会很有用。因此,它最常出现在jQuery编程中,例如用于修改网页上的元素。

由于sleep,set_legscount_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()
于 2013-08-29T07:57:31.450 回答
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()
于 2013-08-29T07:56:56.210 回答
0

1)

def sleep(self):
    print "zzz "
    return self

你的方法可以返回任何东西。对于类中的方法,唯一的义务是将“self”作为第一个参数。就这样。您没有理由退回该对象。您的某些函数不需要任何 return 语句!

def sleep(self):
    print "zzz "

2)以它的书写方式来解释它:从左到右。那些以前的返回是为了让你能够以这种方式链接(你链接返回值)。

于 2013-08-29T08:01:55.620 回答