本投稿のモチベーションとして、これまで2年ほどPythonを使って色々やった中で、未だにselfとかinitという構文を理解し使いこなせていない事に気後れを感じており、GWの10連休を利用して学習を進めようというものである。
#Pythonにおけるクラスの理解
Pythonではクラスという機能を利用してより便利に関数を取り扱うことが出来る。
普通に関数を書くと下記のような記述となるが、
def some_function(something):
print(something)
クラスを利用した場合、次のような記述となる。
class some_class:
def __init__(self,something):
self.something = something
def some_function(self):
print(self.something)
クラス構造を用いる理由は、主に大規模なソフトウェアの構築の際の効率化にあるらしく、小規模なコードであれば普通に関数だけ書いていくやり方でも混乱は起きない模様。参考までにどのような場合でクラスの活用が有効かを調べたところ、こちらには、次のメリットの記載があり。
・グローバル変数を無くし、すべての変数を何らかのスコープに属させる
・処理を効率的に使い回す
・一つの処理は一つの箇所に実装し、修正箇所を最小化する
・関数実行中に、関数自身が再度呼び出される場合の対処
##クラスとインスタンス
こちらの記事にもあるように、Pythonのクラス構造はインスタンスの生成により、その処理を実行することが出来る。
Pythonでクラスのインスタンスの生成と初期化
インスタンスは英語でinstance(=例、事例)であり、次のコードの変数aの部分がインスタンスになる。先ほどのコードのクラス(some_class)のインスタンスを生成している。
a = some_class("some_value")
インスタンスを生成することで、クラスの中で記述した関数を呼び出すことが出来る。まとめて書くと次の通り。
class some_class:
def __init__(self,something):
self.something = something
def some_function(self):
print(self.something)
a = some_class("some_value")
a.some_function()
#関数としてprintを用いているのでsome_valueを返す
##クラスとメソッド
クラスの中で記述される関数をメソッドと呼ぶ。クラス内で複数のメソッドを定義することも可能。
class some_class:
def __init__(self,something):
self.something = something
def some_function1(self):#メソッド1
print(self.something)
def some_function2(self):#メソッド2
return self.something
##selfの役割
これまでのクラスの中で用いられたselfについて調べると「インスタンス自身」、「その時点の自分」、「メソッドの仮引数」など様々な呼び方があるが、クラス構造を取る際の定型の構文として覚えておけば良さそう。
#initの理解
selfと並んでクラス構造の中に登場したinitについては、こちらには下記の説明がある。
・コンストラクタと呼ばれる初期化のための関数(メソッド)
・インスタンス化を行う時に必ず最初に呼び出される特殊な関数(メソッド)
・オブジェクト生成(インスタンスを生成)のついでにデータの初期化を行うもの
class some_class:
def __init__(self,something):#constructor
self.something = something
クラス構造で情報を保持するための重要な構文なので外せない、と覚えておけば良さそう。この構文により、オブジェクト生成時の情報の追加が簡潔に記述出来る。
例えば複数の情報を変数とするクラス構文での処理を行いたい場合は次のような記述になる。
class my_status:
def __init__(self,age,name,height,weight):
self.age = age
self.name = name
self.height = height
self.weight = weight
def print_name(self):
print(self.name)
def print_age(self):
print(self.age)
def print_height(self):
print(self.height)
def print_weight(self):
print(self.weight)
a = my_status(34,"yamada",170,78)#34才、山田さん、170cm、78kgという情報を追加してオブジェクト生成
#終わりに
これまでインスタンス化、オブジェクトなど馴染みのない単語から敬遠していたself、initについても、自分で調べてまとめて見ると何となく理解することが出来たので、まだよく理解できない場合は自分でまとめて見ると良いかと思う。