Python Works

Pythonで色々プログラミングする

Python入門 - クラス その1

オブジェクト指向とは何か?

Pythonではオプジェクト指向プログラミングをサポートしています。オブジェクト指向と言葉にするのは簡単なのですが、そもそもオブジェクト指向とはなんなのでしょうか?

 

簡単に説明すると、「ひとかたまりのデータと機能をまとめた設計図」を用意して、その設計図をもとに「オブジェクト(インスタンスとも言う)」を生成する、と言う内容です。この、「ひとかたまりのデータと機能をまとめた設計図」のことをクラスと言います。

もう少し具体的にクラスとオブジェクトについて説明したいと思います。例えば、車クラスを考えてみます。車には、「エンジン」とか「タイヤ」と言った部品からできています。この部品がクラスのデータに当たります。また、車クラスには「走る」「止まる」と言うような機能もあります。

この車クラスは、まだ設計図でしかありません。そこで、この車クラス(設計図)を利用して、実際に車を作ろうと思います。これを「オブジェクトを生成する」とか「インスタンス化する」と言います。基本的には、実際に車を作ることで初めて「走る」「止まる」と言った機能を利用することができます。また、実際の車ごとにエンジンやタイヤは別々に生成できます(全てのオブジェクトに共通するデータや機能もあります)。ガソリンの量なんかは走った量によって車ごとに違うかもしれませんね。

また、車クラスの部品であるエンジンも、実際にはピストンやシリンダーと言った部品を持つクラスであるといえます。

このように、プログラムを構成する基本的な要素である、「データ」と「機能(関数)」を「クラス」と「オブジェクト」で考えていくことが、オブジェクト指向プログラミングです。

なお、データと機能は、状態と振る舞いと言ったりもします。

 

クラスはオブジェクト指向の核心的な要素であり、様々な考え方や使い方があります。そのため、一度に説明しきることは難しいので少しずつみていきたいと思います。

 

インスタンスメソッドを使う

それでは、早速クラスを使ってみましょう。

 

書式

#クラスの定義
class クラス名:
def メソッド名(self):
        メソッドの処理
        メソッドの処理
        ・・・
#クラスの生成
変数 = クラス名()

 

サンプルコード

class car:
    def run(self):
        print('run!')

    def stop(self):
        print('stop!')

test = car()
test.run()
test.stop()

 

実行結果

run!
stop!

 

先ほど説明したクラスの機能(関数)のことを「メソッド」と言います。特に、オブジェクトを生成してから使うメソッドを「インスタンスメソッド」と言います。

クラスの定義では、インスタンスメソッドの引数に「self」がありますが、実際に呼び出すときには、何も引数を渡していません。

とりあえず、インスタンスメソッドを定義する時には、最初の引数にselfと書くんだと思っておきましょう。

 

コンストラクタ

オブジェクトが生成される時に1度だけ実行される特殊なメソッドのことを、コンストラクタと言います。

 

書式

class クラス名:
    def __init__(self):
        コンストラクタの処理
        コンストラクタの処理
        ・・・

 

サンプルコード

class car:
    def __init__(self):
        print('create!')
        
    def run(self):
        print('run!')

    def stop(self):
        print('stop!')

test = car()
test.run()
test.stop()

 

実行結果

create!
run!
stop!

 

コンストラクタの処理が、オブジェクトを生成する時に実行されていることがわかると思います。コンストラクタでは、一般的にオブジェクトの初期化処理をすることができます。

 

インスタンス変数

オブジェクトを生成すると、オブジェクト内に作られる変数のことを「インスタンス変数」と言います。インスタンス変数はオブジェクトごとに別々のデータです。その定義は、コンストラクタの中でselflを使って行います。

 

書式

class クラス名: 
    def __init__(self): 
        self.インスタンス変数 =  
        
変数 = クラス名() 
変数.インスタンス変数

 

サンプルコード

class car:
    def __init__(self):
        print('create!')
        self.gas = 100
        
    def run(self):
        print('run!')
        
    def stop(self):
        print('stop!')
        
test = car()
test.run()
test.stop()

print(test.gas)

 

実行結果

create!
run!
>stop!
100

 

このように、インスタンス変数をオブジェクトから使うことができます。また、インスタンス変数は、インスタンスメソッド内でもselfを利用して使うことができます。

 

書式

class クラス名:
    def __init__(self):
         self.インスタンス変数 = 
         
    def メソッド名(self):
         self.インスタンス変数

 

サンプルコード

class car:
    def __init__(self):
        print('create!')
        self.gas = 100
        
    def run(self, x):
        print('run!')
        self.gas -= x
        print(self.gas)
        
    def stop(self):
        print('stop!')
        
test = car()
test.run(10)
test.run(5.5)

 

実行結果

create!
run!
90
run!
84.5

 

self

ここで、少しselfについて説明しようと思います。selfはコンストラクタ、インスタンスメソッドに必ず必要な引数で、オブジェクト自分自身を表す特殊なものです。定義をする時には書く必要があるのですが、呼び出す時には自動的に渡されるため、書きません。

そして、このselfを通じで自分自身のインスタンス変数やインスタンスメソッドを呼び出すことができる、という仕組みです。