プロパティとインスタンス変数の違いは何ですか?
-
03-07-2019 - |
質問
これらの用語を交換可能/誤って使用していると思います!
解決
いや、これは基本的に用語の質問であり、「言語にとらわれない」にもかかわらず、この質問に関連付けられているタグ、言語/環境に非常に関連しています。
プロパティはオブジェクトを説明するデータ項目であるという考え方であるため、デザインの議論のために、プロパティとインスタンス変数は同じ意味で使用できます。
特定の言語について話すとき、これら2つは異なる場合があります。たとえば、C#では、プロパティは実際にはオブジェクトを返す関数ですが、インスタンス変数はクラスの非静的メンバー変数です。
他のヒント
Hershiは、これが言語固有であることについて正しいです。しかし、言語固有の回答の軌跡に追加するには:
Pythonでは、インスタンス変数はインスタンスの属性であり、(通常)インスタンスの辞書で参照されるものです。これは、すべてがパブリックであることを除いて、Javaのメンバーまたはインスタンス変数に似ています。
プロパティは、getter / setterメソッドへのショートカットで、インスタンス変数のように見えます。したがって、次のクラス定義では(Guidoの新しいスタイルオブジェクトマニフェストから変更):
class C(object):
def __init__(self):
self.y = 0
def getx(self):
if self.y < 0: return 0
else: return self.y
def setx(self, x):
self.y = x
x = property(getx, setx)
>>> z = C()
>>> z.x = -3
>>> print z.x
0
>>> print z.y
-3
>>> z.x = 5
>>> print z.x
5
>>> print z.y
5
y
は z
のインスタンス変数で、 x
はプロパティです。 (一般に、プロパティが定義されている場合、他のコードが直接アクセスしないように、関連付けられたインスタンス変数を隠すために使用されるいくつかの手法があります。)Pythonのプロパティの利点は、設計者が移動する必要がないことですインスタンス変数をプロパティに変換することにより、将来のカプセル化は既存のコードを破壊しないため、すべてのインスタンス変数を先取りしてカプセル化します(コードがカプセル化が修正しようとしている抜け穴を利用したり、クラス検査やその他のメタに依存している場合を除く) -programming technique)。
これはすべて、設計レベルではプロパティについて話すのが良いと言う非常に長い答えです。どのタイプのカプセル化を実行する必要があるかは不明です。この原則は言語に依存しないと思いますが、Python以外の言語にも適用されます。
C#でのコード例
public class ClassName
{
private string variable;
public string property
{
get{ return variable; }
set { variable = value; }
}
}
目的cでは、プロパティはインスタンス変数であり、オーバーロードされたドット演算子を利用してそのセッターとゲッターを呼び出すことができます。したがって、my.food =&quot; cheeseburger&quot;実際には[my setFood:&quot; cheeseburger&quot;]と解釈されます。これは、objective-cが@propertyキーワードを定義しているため、定義が言語に依存しないことを示す別のケースです。
最初にC ++から来たからでしょうか?! 学生時代には、クラスのプロパティまたはクラスの属性を常に言っている教授がいました。 Java C#の世界に移ったので、メンバーのことを聞き始めました。クラスメンバー、インスタンスメンバー...
そしてプロパティが表示されます! Javaおよび.NETで。ですから、メンバーと呼ぶ方が良いと思います。それはインスタンスメンバ(またはインスタンス変数と呼ばれる)またはクラスメンバです...
乾杯!
プロパティはインスタンス変数を返すことができますが、ほとんどの場合、インスタンス変数を返しますが、それ以上のことができます。プロパティにロジックを入れたり、値を集約したり、他のインスタンス変数を更新したりすることができます。しかし、そうしないことをお勧めします。ロジックはメソッドに入るべきです。
Javaには、 JavaBeansプロパティ、しかしそれは基本的にそのゲッターとセッターの特定の命名パターンに従うインスタンス変数です。
これまで述べてきたことに追加すると、C#のような言語では、プロパティは本質的にgetおよびset関数です。その結果、取得/設定に加えて実行されるカスタムロジックを持つことができます。インスタンス変数ではこれを行えません。
プロパティは、オブジェクトに関連付けられた何らかのデータです。たとえば、円のプロパティはその直径であり、別のプロパティはその面積です。
インスタンス変数は、オブジェクト内に保存されるデータです。必ずしもプロパティに直接対応する必要はありません。例えば(heh)、円はその半径をインスタンス変数に格納し、その半径に基づいて直径と面積を計算します。 3つはすべてプロパティのままですが、半径のみがインスタンス変数に格納されます。
一部の言語には「ファーストクラス」という概念があります。プロパティ。これは、クライアントアプリケーションにとって、プロパティはインスタンス変数のように見え、使用されることを意味します。つまり、 circle.getDiameter()
のようなものを書く代わりに、 circle.setRadius(5)
circle.diameter を書きます。 >、 circle.radius = 5
と記述します。
他の回答とは対照的に、メンバー変数とプロパティには言語に依存しない有用な違いがあると思います 。
この区別は、コンポーネント指向プログラミングで最も顕著であり、どこでも便利ですが、グラフィカルUIで最も理解しやすいです。その文脈では、コンポーネントの設計時の構成は、「プロパティ」を操作するものと考える傾向があります。オブジェクトの。たとえば、プロパティを設定して、テキスト入力フィールドの前景色と背景色、境界線スタイル、フォントを選択します。これらのプロパティは実行時に変更できますが 、通常は変更されません。実行時には、フィールドのコンテンツを表す変数の異なるセットが読み書きされる可能性がはるかに高くなります。この情報を「状態」と考えています。コンポーネントの。
この区別が役立つのはなぜですか?コンポーネントを接続するための抽象化を作成する場合、通常は「状態」のみ変数を公開する必要があります。テキストフィールドの例に戻って、現在のコンテンツへのアクセスを提供するインターフェイスを宣言できます。しかし、「プロパティ」はコンポーネントのルックアンドフィールを制御するものは、具体的な実装クラスでのみ定義されます。