前書き

https://www.digitalocean.com/community/tutorials/how-to-construct-classes-and-define-objects-in-python-3 [オブジェクト指向プログラミング]はhttps://www.digitalocean.comを許可します/ community / tutorials / how-to-use-variables-in-python-3 [変数]は、クラスレベルまたはインスタンスレベルで使用されます。 *変数*は、本質的に、プログラムで使用している値を表す記号です。

クラスレベルでは、変数は*クラス変数*と呼ばれますが、インスタンスレベルの変数は*インスタンス変数*と呼ばれます。

インスタンス間で変数の一貫性が期待される場合、または変数を初期化する場合、クラスレベルでその変数を定義できます。 インスタンス間で変数が大きく変化すると予想される場合、インスタンスレベルで変数を定義できます。

ソフトウェア開発の原則の1つは* DRY *原則で、これは*自分自身を繰り返さない*の略です。 この原則は、コード内での繰り返しを制限することを目的としており、オブジェクト指向プログラミングは冗長性を減らすため、DRY原則に準拠しています。

このチュートリアルでは、Python内のオブジェクト指向プログラミングでクラス変数とインスタンス変数の両方を使用する方法を示します。

クラス変数

クラス変数はhttps://www.digitalocean.com/community/tutorials/how-to-construct-classes-and-define-objects-in-python-3[class construction]内で定義されます。 クラス自体が所有しているため、クラス変数はクラスのすべてのインスタンスで共有されます。 したがって、クラス変数を使用して変数を初期化する場合を除き、通常はすべてのインスタンスで同じ値を持ちます。

すべてのメソッドの外側で定義されたクラス変数は、慣例により、通常クラスヘッダーのすぐ下でhttps://www.digitalocean.com/community/tutorials/how-to-construct-classes-and-define-の前に配置されます。 objects-in-python-3#the-constructor-method [constructor method]およびその他のメソッド。

クラス変数のみは次のようになります。

class Shark:
   animal_type = "fish"

ここで、変数 `+ animal_type `には値 `” fish “+`が割り当てられます。

`+ Shark `クラスのインスタンスを作成し(これを ` new_shark +`と呼びます)、ドット表記を使用して変数を出力できます。

shark.py

class Shark:
   animal_type = "fish"

new_shark = Shark()
print(new_shark.animal_type)

プログラムを実行しましょう:

python shark.py
Outputfish

プログラムは変数の値を返します。

さらにいくつかのクラス変数を追加して出力します。

shark.py

class Shark:
   animal_type = "fish"
   location = "ocean"
   followers = 5

new_shark = Shark()
print(new_shark.animal_type)
print(new_shark.location)
print(new_shark.followers)

他の変数と同様に、クラス変数は、Pythonで使用可能なhttps://www.digitalocean.com/community/tutorials/understanding-data-types-in-python-3[data type]で構成できます。 このプログラムには、文字列と整数があります。 `+ python shark.py +`コマンドを使用してプログラムを再度実行し、出力を確認します。

Outputfish
ocean
5

`+ new_shark +`のインスタンスは、すべてのクラス変数にアクセスし、プログラムを実行するときにそれらを出力できます。

クラス変数を使用すると、クラスの構築時に変数を定義できます。 これらの変数とそれらに関連付けられた値は、クラスの各インスタンスからアクセス可能になります。

インスタンス変数

インスタンス変数は、クラスのインスタンスによって所有されます。 これは、クラスのオブジェクトまたはインスタンスごとに、インスタンス変数が異なることを意味します。

クラス変数とは異なり、インスタンス変数はメソッド内で定義されます。

以下の + Shark`クラスの例では、 + name`と `+ age`はインスタンス変数です:

class Shark:
   def __init__(self, name, age):
       self.name = name
       self.age = age

`+ Shark +`オブジェクトを作成するとき、これらの変数を定義する必要があります。これらの変数は、コンストラクターメソッドまたは別のメソッド内のパラメーターとして渡されます。

class Shark:
   def __init__(self, name, age):
       self.name = name
       self.age = age

new_shark = Shark("Sammy", 5)

クラス変数と同様に、インスタンス変数を出力するために同様に呼び出すことができます。

shark.py

class Shark:
   def __init__(self, name, age):
       self.name = name
       self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

`+ python shark.py +`で上記のプログラムを実行すると、次の出力が表示されます。

OutputSammy
5

受け取る出力は、 `+ new_shark +`のオブジェクトインスタンスに対して初期化した変数の値で構成されています。

`+ stevie `と呼ばれる ` Shark +`クラスの別のオブジェクトを作成しましょう:

shark.py

class Shark:
   def __init__(self, name, age):
       self.name = name
       self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

`+ new_shark `オブジェクトのような ` stevie `オブジェクトは、 ` Shark +`クラスのインスタンスに固有のパラメーターを渡し、インスタンス変数に値を割り当てます。

クラスのオブジェクトが所有するインスタンス変数を使用すると、オブジェクトまたはインスタンスごとに、それらの変数に異なる値を割り当てることができます。

クラス変数とインスタンス変数を一緒に使用する

クラス変数とインスタンス変数は同時に使用されることが多いため、作成した `+ Shark +`クラスを使用してこの例を見てみましょう。 プログラムのコメントは、プロセスの各ステップの概要を示しています。

shark.py

class Shark:

   # Class variables
   animal_type = "fish"
   location = "ocean"

   # Constructor method with instance variables name and age
   def __init__(self, name, age):
       self.name = name
       self.age = age

   # Method with instance variable followers
   def set_followers(self, followers):
       print("This user has " + str(followers) + " followers")


def main():
   # First object, set up instance variables of constructor method
   sammy = Shark("Sammy", 5)

   # Print out instance variable name
   print(sammy.name)

   # Print out class variable location
   print(sammy.location)

   # Second object
   stevie = Shark("Stevie", 8)

   # Print out instance variable name
   print(stevie.name)

   # Use set_followers method and pass followers instance variable
   stevie.set_followers(77)

   # Print out class variable animal_type
   print(stevie.animal_type)

if __name__ == "__main__":
   main()

`+ python shark.py +`でプログラムを実行すると、次の出力が表示されます。

OutputSammy
ocean
Stevie
This user has 77 followers
fish

ここでは、 `+ Shark `クラスの2つのオブジェクト、 ` sammy `と ` stevie +`でクラス変数とインスタンス変数の両方を使用しました。

結論

オブジェクト指向プログラミングでは、クラスレベルの変数はクラス変数と呼ばれ、オブジェクトレベルの変数はインスタンス変数と呼ばれます。

この区別により、クラス変数を使用して、変数に割り当てられた特定の値でオブジェクトを初期化し、インスタンス変数を持つ各オブジェクトに異なる変数を使用できます。

クラス固有の変数とインスタンス固有の変数を使用すると、コードがDRY原則に準拠し、コード内の繰り返しを減らすことができます。