Python3のクラス変数とインスタンス変数を理解する

提供:Dev Guides
移動先:案内検索

序章

オブジェクト指向プログラミングでは、変数をクラスレベルまたはインスタンスレベルで使用できます。 変数は基本的に、プログラムで使用している値を表すシンボルです。

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

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

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

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

前提条件

Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)

クラス変数

クラス変数は、クラス構造内で定義されます。 それらはクラス自体によって所有されているため、クラス変数はクラスのすべてのインスタンスによって共有されます。 したがって、クラス変数を使用して変数を初期化しない限り、通常、これらはすべてのインスタンスで同じ値になります。

すべてのメソッドの外部で定義されるクラス変数は、慣例により、通常、クラスヘッダーのすぐ下、コンストラクターメソッドおよびその他のメソッドの前に配置されます。

情報:このチュートリアルのサンプルコードに従うには、python3コマンドを実行して、ローカルシステムでPythonインタラクティブシェルを開きます。 次に、>>>プロンプトの後に例を追加して、例をコピー、貼り付け、または編集できます。


クラス変数だけでは、次のようになります。

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で使用可能な任意のデータ型で構成できます。 このプログラムには、文字列と整数があります。 python shark.pyコマンドを使用してプログラムを再度実行し、出力を確認してみましょう。

Outputfish
ocean
5

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

クラス変数を使用すると、クラスの作成時に変数を定義できます。 これらの変数とそれに関連する値は、クラスの各インスタンスからアクセスできます。

インスタンス変数

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

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

以下のSharkクラスの例では、nameageはインスタンス変数です。

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)
OutputSammy
5
Stevie
8

stevieオブジェクトは、new_sharkオブジェクトと同様に、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つのオブジェクトsammystevieでクラス変数とインスタンス変数の両方を使用しました。

結論

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

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

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