私はこれらの用語を交換可能/間違って使用していると思います!
10 に答える
Iain、これは基本的に用語の質問であり、この質問に関連付けられている「言語に依存しない」タグにもかかわらず、言語/環境に非常に関連しています。
プロパティはオブジェクトを記述するデータ項目であるという考え方であるため、設計上の議論のために、プロパティとインスタンス変数は交換可能に使用できます。
特定の言語について話すとき、これら2つは異なる場合があります。たとえば、C#では、プロパティは実際にはオブジェクトを返す関数ですが、インスタンス変数はクラスの非静的メンバー変数です。
目的 c では、プロパティはインスタンス変数であり、オーバーロードされたドット演算子を利用してセッターとゲッターを呼び出すことができます。したがって、 my.food = "cheeseburger" は実際には [my setFood:"cheeseburger"] と解釈されます。これは、objective-c が @property キーワードを定義しているため、定義が明らかに言語にとらわれない別のケースです。
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 でのプロパティの利点は、設計者があちこち移動する必要がないことです。すべてのインスタンス変数を先制的にカプセル化します。これは、インスタンス変数をプロパティに変換することによる将来のカプセル化によって既存のコードが壊れてはならないためです (カプセル化が修正しようとしている抜け穴をコードが利用している場合や、クラス インスペクションやその他のメタに依存している場合を除きます)。 -プログラミング技術)。
これはすべて、設計レベルでプロパティについて話すのは良いことだと言うには非常に長い答えです。どのタイプのカプセル化を実行する必要があるかは不明です。この原則は言語にとらわれないものではないと思いますが、Python 以外の言語にも当てはまります。
C#で行われたコード例
public class ClassName
{
private string variable;
public string property
{
get{ return variable; }
set { variable = value; }
}
}
プロパティはインスタンス変数を返すことができ、ほとんどの場合そうだと思いますが、それ以上のことを行うことができます。プロパティにロジックを配置したり、値を集計したり、他のインスタンス変数を更新したりすることができます。ただし、そうしないことが最善だと思います。ロジックはメソッドに入る必要があります。
多分それはあなたが最初に C++ から来たからですよね?! 私の学生時代には、クラスのプロパティまたはクラスの属性を常に言っていた教授がいました。Java C# の世界に移ってから、メンバーのことを耳にするようになりました。クラスメンバー、インスタンスメンバー...
そして、プロパティが表示されます!Java および .NET で。だからメンバーと呼んだ方がいいと思います。それらがインスタンスメンバー(またはインスタンス変数と呼ばれる)であるか、クラスメンバーであるか....
乾杯!
プロパティは、オブジェクトに関連付けられたある種のデータです。たとえば、円のプロパティは直径であり、別のプロパティはその面積です。
インスタンス変数は、オブジェクト内に格納されるデータの一部です。必ずしもプロパティに直接対応する必要はありません。たとえば、円はその半径をインスタンス変数に格納し、その半径に基づいて直径と面積を計算できます。3 つすべてが引き続きプロパティですが、半径のみがインスタンス変数に格納されます。
一部の言語には、「ファースト クラス」プロパティの概念があります。これは、クライアント アプリケーションにとって、プロパティがインスタンス変数のように見え、使用されることを意味します。つまり、 のようなものを書く代わりに、 とcircle.getDiameter()
書きcircle.diameter
、 の代わりにcircle.setRadius(5)
と書きcircle.radius = 5
ます。
Java にはJavaBeans Propertiesと呼ばれるものがありますが、これは基本的に、ゲッターとセッターの特定の命名パターンに従うインスタンス変数です。
これまで述べてきたことに加えて、C# のような言語では、プロパティは本質的に get および set 関数です。その結果、取得/設定に加えて実行されるカスタム ロジックを持つことができます。インスタンス変数はこれを行うことができません。
与えられた他の回答とは対照的に、言語に依存しないメンバー変数とプロパティの間には有用な区別があると思います。
この違いは、どこでも役立つコンポーネント指向プログラミングで最も顕著ですが、グラフィカル UI で理解するのが最も簡単です。その文脈では、コンポーネントの設計時の構成は、オブジェクトの「プロパティ」を操作するものと考える傾向があります。たとえば、プロパティを設定して、テキスト入力フィールドの前景色と背景色、境界線のスタイル、およびフォントを選択します。これらのプロパティは実行時に変更できますが、通常は変更されません。実行時には、フィールドの内容を表す別の変数セットが読み書きされる可能性が高くなります。この情報をコンポーネントの「状態」と考えています。
この区別が役立つのはなぜですか。コンポーネントを一緒に配線するための抽象化を作成する場合、通常は「状態」変数のみを公開する必要があります。テキスト フィールドの例に戻ると、現在のコンテンツへのアクセスを提供するインターフェイスを宣言できます。ただし、コンポーネントのルック アンド フィールを制御する「プロパティ」は、具体的な実装クラスでのみ定義されます。