类中的Python方法

时间:2013-08-29 07:51:55

标签: python

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

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

4 个答案:

答案 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编程,例如用于修改网页上的元素。

由于sleepset_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_legscount_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)以书面方式解释:从左到右。 那些先前的回报是你能够以这种方式链接的(你在返回值上链接)。