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

これは、メソッド チェーンパターンの例です。Python では珍しいことですが、同じオブジェクトに対して複数のアクションを実行したい場合に一般的に役立ちます。このため、Web ページの要素を変更する場合など、 jQueryプログラミングでよく見られます。

sleepset_legsおよびcount_legsメソッドは重要なものを何も返さないため、何も返さない代わりに、メソッドが呼び出されたオブジェクトを返すこともできます。

これにより、直後に同じオブジェクトに対して別のことをしたい場合に、1 行のコードに圧縮できます。

コード行を説明するには:

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 に答える
2

両方の質問は関連しています。メソッドは、作業中のオブジェクトであるselfを返します。これにより、最初のメソッドの結果が2番目のメソッドを呼び出すオブジェクトになるため、メソッドをチェーンできます。

例えば

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 に答える
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 に答える