私はオープンソースプロジェクトでこのようなものに出会いました。インスタンス属性を変更するメソッドは、インスタンスへの参照を返します。この構成の目的は何ですか?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
私はオープンソースプロジェクトでこのようなものに出会いました。インスタンス属性を変更するメソッドは、インスタンスへの参照を返します。この構成の目的は何ですか?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
回答:
連鎖を許可するためです。
例えば:
var Car = function () {
return {
gas : 0,
miles : 0,
drive : function (d) {
this.miles += d;
this.gas -= d;
return this;
},
fill : function (g) {
this.gas += g;
return this;
},
};
}
今、あなたは言うことができます:
var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;
@Lie Ryanと@Frank Sheararが言及したように、それは「流fluentなインターフェース」と呼ばれていますが、そのパターンは長い間存在していました。
そのパターンの議論の余地のある部分は、オブジェクト指向では可変状態であるため、voidメソッドには暗黙の戻り値のthis
種類があります。つまり、更新された状態のオブジェクトは戻り値の種類です。
したがって、可変状態のオブジェクト指向言語では、これら2つはほぼ同等です。
a.doA()
a.doB()
a.doC()
...とは対照的に
a.doA().doB().doC()
過去の人々は、流formなインターフェイスに抵抗していると聞いたことがあります。私が「流fluentなインターフェース」で聞いた別の名前は「列車事故」です;)
しかし、流interfacesなインターフェースはしわを追加するため、「多かれ少なかれ同等」と言います。彼らは「これを返す」必要はありません。彼らは「新しいものを返す」ことができます。それがオブジェクト指向で不変オブジェクトを達成する方法です。
だから、あなたは(擬似コード)を行うクラスAを持つことができます
function doA():
return new A(value + 1)
function doB():
return new A(value * 2)
function doC():
return new A(sqrt(value))
現在、各メソッドは真新しいオブジェクトを返し、初期オブジェクトは変更されません。そして、それはコードをあまり変更せずに不変オブジェクトに入る方法です。
new(...)
メモリリークが発生します。
__init__
繰り返し呼び出すとオーバーヘッドも発生します。
ほとんどの言語は「return self」イディオムを認識しており、行で使用されていない場合は無視します。ただし、Pythonでは、関数None
がデフォルトで戻ることは注目に値します。
私がCS学校にいたとき、私のインストラクターは、機能、手順、ルーチン、および方法の違いについて非常に多くのことをしました。シャープなエッセイの質問の多くは、シャープペンシルがそのすべてについて私の手で熱くなり、徹底的に解決されました。
selfを返すことは、クラスメソッドを作成する決定的なオブジェクト指向の方法ですが、Pythonでは複数の戻り値、タプル、リスト、オブジェクト、プリミティブ、またはNoneを使用できます。
チェーンとは、最後の操作に対する答えを次の操作に入れることであり、Pythonのランタイムはそのようなことを最適化できます。リスト内包表記は、この組み込み形式です。(とてもパワフルな!)
したがって、Pythonでは、すべてのメソッドまたは関数が値を返すことはそれほど重要ではないため、デフォルトはNoneです。
プログラム内のすべてのアクションは、成功、失敗、または結果を呼び出し側のコンテキストまたはオブジェクトに報告する必要がありますが、ここではDOD ADA要件について説明していなかったという考え方があります。メソッドからフィードバックを取得する必要がある場合は、先に進むかどうかにかかわらず、一貫性を保つようにしてください。
メソッドが失敗する可能性がある場合、成功または失敗を返すか、処理する例外を発生させる必要があります。
1つの注意点は、return selfイディオムを使用すると、Pythonですべてのメソッドを変数に割り当てることができ、実際にオブジェクトを取得しているときにデータ結果またはリストを取得していると思われることです。
これを行おうとすると、型制限言語は叫び声を上げて叫びますが、解釈された言語(Python、Lua、Lisp)ははるかに動的です。
return self
)例:
print(foo.modify1().modify2())
# instaed of
foo.modify1()
foo.modify2()
print(foo)
プログラミングコミュニティでより一般的なスタイル(私は思う)。
return self
)return
他の目的に使用する能力。