[Python] クラス型オブジェクト

クラス

・「クラスは独立した状態やメソッドを持つオブジェクト」を生成するための型の記述である。すでにわからない、型とは?
・「クラスは独立した状態やメソッドを持つオブジェクト」=クラス型オブジェクト?
・クラスから生成された個々のオブジェクトをインスタンスと呼ぶ。(クラス型オブジェクトとの違いは?)

# 文法
class クラス名():
    状態やメソッドの定義
# ex.1
class Calculation():
    # クラス型オブジェクトが生成されたときに実行されるメソッド
    # ここではインスタンス変数の定義および初期化の役割
    def __init__(self):
        self.first = 0
        self.second = 0
        self.result = 0

    # 計算の実行部分
    def do_calculation(self):
        self.result = self.first + self.second

# メインプログラム
# クラス型オブジェクトを生成
calculation = Calculation()
# クラス内のメソッド等の呼び出し
calculation.first = 7
calculation.second = 5
calculation.do_calculation()
r = calculation.result
print(r)
>>>12

・クラス名の命名には、変数や関数などと同様に一定の自由があるが、慣習としてクラス名の先頭の文字を大文字にする。複数後での命名の場合には各語の先頭を大文字にして、単語間のスペースは省略する。(ex. MyCalculation)
・Python では一般的に__(アンダーバー2つ)で始まるメソッドに特殊な役割を持たせる。__init__(self) はクラスのオブジェクトが生成される際に、必ず実行されるメソッドである。
・クラスのメソッド定義では、引数が必ず必要で、通常 self という名前で与える。self. で始まる変数はインスタンス変数と呼ばれる。インスタンス変数はそのクラスのオブジェクトが生成されるごとにオブジェクトに固有の変数をとり、そのオブジェクトの中で永続的に使える変数である。ここが一番わからない。

・メインプログラムはインデントがclassと同じ位置になっている位置から下の部分である。クラス型オブジェクト(?)を生成して、生成したオブジェクトを変数 'calculation' に代入している。
・この変数に . をつけてクラス内で定義したメソッド(num1やnum2はインスタンス変数と呼ぶべき?)を呼び出す。

クラス変数と変数の保護機能

・クラスの定義で、メソッドの定義の外側に宣言された変数をクラス変数と呼ぶ。クラス名.変数名の形でクラス型オブジェクトを生成しなくても参照可能である。
・クラス外から変数を保護する方法として、'__変数名' がある。このような変数はクラス内からはアクセスが可能であるが、外からの操作は不可能である。

# ex.2
class Cal():
    # クラス変数の定義
    first = 1
    __second = 2
    
    # インスタンス変数の定義
    def __init__(self):
        self.result = 0

    # 計算の実行部分
    def do_calculation(self):
        self.result = Cal.first + Cal.__second

# メインプログラム
calculation = Calculation()
# クラスの外部からクラス変数とメソッドを呼び出す
Cal.first = 7
Cal.__second = 5
calculation.do_calculation()
r = calculation.result
print(r)
>>> 9

・ex.2 でクラス変数は 'first' と '__second' である。また、インスタンス変数は '(self.)result' である。
・クラス変数のうち、 '__second' はクラス外の操作から保護されている。従って、メインプログラムの 'Cal.__second = 5' によって上書きされない。このとき 'first' は上書きされるため、7 + 2 で結果は 9 になる。

環境

OS : windows 10(64 bit)
Python version : 3.8.2
テキストエディタ : VSCode

この記事が気に入ったらサポートをしてみませんか?