前書き
Object-oriented programmingを使用すると、variablesをクラスレベルまたはインスタンスレベルで使用できます。 Variablesは基本的に、プログラムで使用している値を表す記号です。
クラスレベルでは、変数はclass variablesと呼ばれ、インスタンスレベルの変数はinstance variablesと呼ばれます。
インスタンス間で変数の一貫性が期待される場合、または変数を初期化する場合、クラスレベルでその変数を定義できます。 インスタンス間で変数が大きく変化すると予想される場合、インスタンスレベルで変数を定義できます。
ソフトウェア開発の原則の1つは、don’t repeat yourselfを表すDRYの原則です。 この原則は、コード内での繰り返しを制限することを目的としており、オブジェクト指向プログラミングは冗長性を減らすため、DRY原則に準拠しています。
このチュートリアルでは、Python内のオブジェクト指向プログラミングでクラス変数とインスタンス変数の両方を使用する方法を示します。
クラス変数
クラス変数はclass construction内で定義されます。 クラス自体が所有しているため、クラス変数はクラスのすべてのインスタンスで共有されます。 したがって、クラス変数を使用して変数を初期化する場合を除き、それらは通常、すべてのインスタンスで同じ値を持ちます。
すべてのメソッドの外部で定義されるクラス変数は、慣例により、通常、クラスヘッダーのすぐ下、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で使用可能な任意の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)
stevie = Shark("Stevie", 8)
print(stevie.name)
print(stevie.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原則に準拠し、コード内の繰り返しを減らすことができます。