encapsulation class static - メンバー以外のメンバーとPythonのメンバー関数





2 Answers

自由な関数は、最初のパラメータにダックタイピングを使用する柔軟性を提供します。

メンバー関数は、その機能をクラスに関連付ける表現力を提供します。

それに応じて選択します。 一般的に、関数は等しく作成されるため、クラスのインタフェースについてはすべて同じ仮定を持つ必要があります。 無料のファンクションscaleを公​​開すると、 .dX.dYVectorパブリックインターフェイスの一部であることを効果的に宣伝しています。 それはおそらくあなたが望むものではありません。 これは、 .dX.dYを持つ他のオブジェクトと同じ関数を再利用することと.dYます。 それはおそらくあなたにとって貴重ではないでしょう。 この場合、私は確かにメンバー関数を好むでしょう。

自由関数を好む良い例としては、標準ライブラリ以外のものを探す必要があります。 sortedは自由な関数であり、 listメンバ関数ではありません。なぜなら、概念的には、任意のイテラブルをソートした結果得られるリストシーケンス。

変数 クラス 静的メンバ

私はPythonには比較的新しく、C ++やJavaのバックグラウンドから習得した習慣と言語の機能を調和させるのに苦労しています。

私が直面している最新の問題は、特にMeyerの「 Effective C ++ 」のItem 23で最もよくまとめられたカプセル化に関するものです

メンバー以外の非友人機能をメンバー機能に優先する

friendメカニズムがないのを無視して、 メンバ関数はPythonのメンバ関数よりも好ましいと考えられますか?

義務的なasinineの例:

class Vector(object):
    def __init__(self, dX, dY):
        self.dX = dX
        self.dY = dY

    def __str__(self):
        return "->(" + str(self.dX) + ", " + str(self.dY) + ")"

    def scale(self, scalar):
        self.dX *= scalar
        self.dY *= scalar

def scale(vector, scalar):
    vector.dX *= scalar
    vector.dY *= scalar

v = Vector(10, 20) scale(v, 2)を指定すると、ベクトルの大きさを2倍にするためにv.scale(2)またはscale(v, 2)を呼び出すことができます。

この場合にプロパティを使用しているという事実を考慮すると、2つのオプションのどちらがあれば、どちらが良いの?




独自の例を見てください。非メンバ関数は、Vectorクラスのデータメンバーにアクセスする必要があります。 これはカプセル化のための勝利ではありません。 これは、渡されたオブジェクトのデータメンバを変更するときに特にそうです。この場合は、スケーリングされたベクトルを返し、元のまま変更しない方がよい場合があります。

さらに、非メンバ関数を使ってクラス多形性のメリットを実感することはできません。 例えば、この場合、2つの成分のベクトルにしか対処できない。 ベクトル乗算機能を使用した方が良いか、またはコンポーネントを反復処理するメソッドを使用する方が良いでしょう。

要約すれば:

  1. メンバ関数を使用して、制御するクラスのオブジェクトを操作します。
  2. 非メンバ関数を使用して、それ自体が多相であるメソッドおよび演算子によって実装される純粋に汎用の演算を実行します。
  3. おそらく、メソッドにオブジェクトの変異を残すほうがよいでしょう。



Related