5.クラスについて
5.クラスについて
構文ルールに従ってクラスを定義するには、classに続けて、任意のクラス名を記述することになる。クラスの命名規約( PEP8 )では、①クラス名の頭文字は常に大文字で記述する(例:Calcu) ②クラス名称が複数ある場合は、常に頭文字を大文字で記載する。(例:CalcuClassName)
クラスはオブジェクトがどのような変数(プロパティ)や手続き(メソッド)を持つかを定義した設計図あるいはひな形であり、プログラム中で実際にオブジェクトとして扱うにはメインメモリ上に領域を確保して実体化する必要がある。
オブジェクト指向のプログラミングにおいて、インスタンス(クラスを基にした実際の値としてのデータ)を生成することをインスタンス化と呼ぶ。つまり、クラスを利用する場合には、必ずインスタンス化が必要となり、インスタンスの生成には、インスタンス=クラス名()とする。
オブジェクトは「データ」と「手続き」から構成されており、この手続き(method)の部分がメソッドに相当し、プロパティ(属性)は、オブジェクト固有のデータで、オブジェクトの性質や設定に関する情報である。コンストラクタは、クラスの処理を実行するインスタンスが生成される際に実行されるメソッドで、主にクラスの変数を初期化する際に使われる。
クラスの中身は、メソッドやコンストラクタからなり、クラス内に定義された関数をメソッドと呼ぶ。ただし、普通の関数とメソッドで異なるのが、メソッドは必ず1つ以上の引数を持つということである。メソッドを定義する際には、かならず "self" という引数を指定する必要がある。この
"self" は、インスタンス自身を表す引数で、必ず1番初めの引数として記述する。ただし、必ずしも"self"でなければいけないわけではない。thatや yourselfなどでも可であるが、Pythonプログラミングの慣例として"self"と記述する。
また、メソッドの呼び出しは、インスタンス名 .メソッド名()として、必ずインスタンスを指定する必要がある。ただし、クラスの中では実行時まだインスタンスが生成されていない状態であり、そのために必要なのが仮インスタンス名の役割を担うのがselfであり、このselfはこのクラス自身を表現しているとも考えられる。
「self.method1("Hello
World") 」を日本語に直すと「このクラスの中の、method1を呼び出す」ということである。
コンストラクタは、オブジェクトが生成される時に一度だけ実行されるメソッドのことで、基本的には、初期化を目的として利用される。コンストラクタは「 __init__ 」と表現され、init の前後に"_"アンダーバー2つで囲う。コンストラクタで、変数"a"と変数"b"を宣言。その後に中身を表示するプログラムコードで、インスタンスが生成される時点で、変数"a" "b"にそれぞれの値を格納している。
class
CalcuClass():
def __init__(self):
self.a = 2021
self.b = "Hello World"
ins =
CalcuClass()
print(ins.a)
print(ins.b)
実行結果
2021
Hello World
次のサンプルプログラムは、インスタンスが呼び出された時点で、自動的にコンストラクタが実行されるため、変数"a"は2021で上書きされた結果、「2020」が表示される。これが、コンストラクタという概念である。
class
CalcuClass():
a = 2020 # 変数aの初期値:2020
def __init__(self):
self.a = 2021
ins =
CalcuClass()
print(ins.a)
実行結果
2020
デストラクタは、コンストラクタの反対で、インスタンスが破棄されるタイミングで一度だけ呼び出されるメソッドで、インスタンスを破棄したタイミングで、del insのデストラクタ処理でprint('Good Bye')」が行われ、最後に画面に「さようなら」という文字が表示される結果となる。
class
CalcuClass():
# コンストラクタ
def __init__(self):
self.a = 2021
self.b = "Hello World"
# デストラクタ
def __del__(self):
print("Good Bye")
ins =
CalcuClass()
print(ins.a)
print(ins.b)
del
ins # インスタンスの破棄
実行結果
2021
Hello World
Good Bye
クラス内で利用できる変数
Pythonのクラスの中で利用できる変数は大きく2種類に分解できる。1つが、クラス変数。もう1つが、インスタンス変数である。クラス変数は、クラス内で定義する変数のことで、全てのインスタンスで共通となる変数で、クラスの定義文直下に記述することで、クラス変数になる。次のコードで異なるインスタンス(ins1や ins2)でも、同じ「Hello
World」として出力されていることが分かる。
class CalcuClass:
a = 'Hello World' #クラス変数
def s_method1(self):
print(self.a)
ins1 =
CalcuClass() #インスタンス1
ins1.s_method2()
ins2 =
CalcuClass() #インスタンス2
ins2.s_method2()
# 結果
Hello World
Hello World
インスタンス変数は、クラス変数と異なりインスタンスに依存する変数である。つまり、インスタンスごとに異なる値になる変数である。インスタンス変数は、メソッドの直下で "self" の属性として定義する。次のコードでインスタンス変数は、インスタンスごとに異なる値となっていることが分かる。
class
CalcuClass():
# コンストラクタ
def __init__(self,aaa):
self.aaa = aaa #引数aaa値をインスタンス変数の初期値に
ins1 =
CalcuClass("Hello") #引数aaaにHello!を渡す
print(ins1.aaa)
ins2 =
CalcuClass("Good Bye") #引数aaaにGood Bye!を渡す
print(ins2.aaa)
実行結果
Hello
Good Bye