クラス内で定義されているプロパティやメソッドに関係なく、それらをクラスの外部から直接呼び出すことはできないことがわかっているため、クラスを完全に独立したスコープ (クラス名前空間と呼ばれます) と見なすことができます。実際にはクラス名前空間で定義された変数です (クラス メソッドは実際にはクラス名前空間で定義された関数です)。
属性が定義される場所に応じて、クラス属性はクラス属性 (その後、クラス変数によって表されます) とインスタンス属性 (その後、インスタンス変数によって表されます) に分割できます。 。
クラス変数 (クラス属性) (推奨学習: Python ビデオ チュートリアル )
クラス変数とは、クラス内で定義された変数を指しますが、各クラスメソッドの外部の変数。クラス変数の特徴は、クラスのインスタンス化されたすべてのオブジェクトがクラス変数の値を共有できることです。つまり、クラス変数は、インスタンス化されたすべてのオブジェクトでパブリック リソースとして使用できます。
クラス変数にはクラス名を使用して直接アクセスすることをお勧めしますが、オブジェクト名を使用してアクセスすることもできることに注意してください。
たとえば、次のコードは Address クラスを定義し、そのクラスの複数のクラス属性を定義します。
class Address : detail = '广州' post_code = '510660' def info (self): # 尝试直接访问类变量 #print(detail) # 报错 # 通过类来访问类变量 print(Address.detail) # 输出 广州 print(Address.post_code) # 输出 510660 #创建 2 个类对象 addr1 = Address() addr1.info() addr2 = Address() addr2.info() # 修改Address类的类变量 Address.detail = '佛山' Address.post_code = '460110' addr1.info() addr2.info()
このプログラムでは、コードの 2 行目と 3 行目で 2 つのクラス変数を定義します。 2つのクラス変数を出力するプログラム内で初めてAddressオブジェクトのinfo()メソッドが呼び出された場合、2つのクラス変数の初期値が出力されます。次に、プログラムは Address クラスを通じて 2 つのクラス変数の値を変更します。そのため、プログラムが 2 回目に info() メソッドを通じて 2 つのクラス変数を出力すると、2 つのクラス変数の変更された値は出力される。
上記のコードを実行すると、次の出力が表示されます:
广州 510660 广州 510660 佛山 460110 佛山 460110
出力から、addr1 と addr2 がクラス変数を共有していることがわかります。つまり、クラス変数の値を変更しています。このクラスのインスタンス化されたすべてのオブジェクトに対して機能します。
インスタンス変数とは、クラスのメソッドに定義された属性を指し、そのメソッドを呼び出したオブジェクトに対してのみ作用するのが特徴です。
インスタンス変数にはオブジェクト名を介してのみアクセスでき、クラス名を介して直接アクセスすることはできないことに注意してください。
Python では、オブジェクトを通じてクラス変数にアクセスできますが、クラス変数の値はオブジェクトを通じて変更できません。なぜなら、オブジェクトを通じてクラス変数の値を変更することは、「クラス変数に値を割り当てる」ことではなく、新しいインスタンス変数を定義することだからです。
たとえば、次のプログラム:
class Inventory: # 定义两个类变量 item = '鼠标' quantity = 2000 # 定义实例方法 def change(self, item, quantity): # 下面赋值语句不是对类变量赋值,而是定义新的实例变量 self.item = item self.quantity = quantity # 创建Inventory对象 iv = Inventory() iv.change('显示器', 500) # 访问iv的item和quantity实例变量 print(iv.item) # 显示器 print(iv.quantity) # 500 # 访问Inventory的item和quantity类变量 print(Inventory.item) # 鼠标 print(Inventory.quantity) # 2000
上記のプログラムでは、コードの 8 行目と 9 行目で、例を通じて item 変数と数量変数に値を割り当てます。代入ではありますが、代入ではなく、2 つのインスタンス変数を再定義します。
クラスでは、インスタンス変数とクラス変数は同じ名前を持つことができますが、この場合、クラス オブジェクトを使用すると、インスタンス変数が優先されるため、クラス変数を呼び出すことができなくなります。 「クラス変数はオブジェクトの名前呼び出しを使用する」という理由で、これも推奨されません。
上記のプログラムは、Inventory オブジェクトのchange()メソッドを呼び出した後、Inventoryオブジェクトのitem変数とquantity変数にアクセスします。オブジェクト自体がこれら2つのインスタンス変数を持っているため、プログラムは次のインスタンス変数を出力します。オブジェクト.値; 次に、プログラムは Inventory を介してその品目と数量のクラス変数にアクセスしますが、このとき実際にクラス変数にアクセスします。
上記のプログラムを実行すると、次の出力が表示されます:
显示器 500 鼠标 2000
以上がPythonのクラス変数とインスタンス変数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。