【Python】クラスの作り方。データと関数を1つにまとめる【入門第30回】
目次
- クラスとは?
- クラスの作り方
- クラスからインスタンスを作る
- クラスにメソッドを作る
__init__
メソッドとは?- __del__メソッドとは?
- クラスにインスタンス変数を作る
- インスタンス変数の値をインスタンスを作るときに指定できるようにする
- おわりに
- 関連動画
クラスとは?
こんにちは、narupoです。
今回からPythonのクラスをやっていきます。
クラスとは、データとそれを処理する関数を、1つにまとめるための機能です。
このクラスをうまく使うとすっきりとしたプログラミングが可能です。
まぁ、最初はすっきりとしたコードは書けませんが、練習を積んでいくと書けるようになります。
今回は、具体的には↓を見ていきます。
クラスの作り方
クラスからインスタンスを作る
クラスにメソッドを作る
__init__メソッドとは?
__del__メソッドとは?
クラスにインスタンス変数を作る
インスタンス変数の値をインスタンスを作るときに指定できるようにする
クラスの作り方
クラスは↓のように作ります。
class クラス名:
内容
class
と書いて、ついでクラス名を書きます。
コロン(:
)をつけてインデントして、クラスの内容を書きます。
たとえば、Car
というクラスを作る場合は↓のようにします。
:::python
class Car:
pass
pass
は何もしない命令ですが、これをクラス内に書くことで空っぽのクラスを作ることができます。
クラスからインスタンスを作る
先ほど作ったクラス。
:::python
class Car:
pass
↑このクラスは、設計図に例えることができます。
何の設計図かと言うと、インスタンスの設計図です。
インスタンスとは一体何なのかという話ですが、インスタンスとはクラスを実体化したものです。
例えるなら自動車の設計図がクラスで、実際に設計図をもとに組み立てられた動く自動車がインスタンスと言えます。
↑のクラスからインスタンスを作るには↓のようにします。
:::python
car = Car()
クラス名にカッコ(()
)を付けると、クラスからインスタンスが作られます。
その作ったインスタンスを左のcar
という変数に代入(=
)しています。
このとき、変数car
をクラスCar
のインスタンスと言います。
クラスCar
は空っぽのクラスで、何の機能も持ってないので、インスタンスのcar
も機能を持っていません。
なにもしないインスタンス、前衛的な芸術性を感じる
クラスにメソッドを作る
さきほどの何の機能も持っていないクラスCar
に、機能を加えてみましょう。
クラスには関数を持たせることができます。
このとき、この関数をメソッドと言います。
車なので走らせるメソッド、run
を作ります。
:::python
class Car:
def run(self):
print('走ります!')
run
メソッドの引数に見慣れないself
という引数がありますが、これにはインスタンスが入ります。
Pythonのクラスではメソッドにこのself
を書くのがお約束になっています。
このrun
メソッドをインスタンスから呼び出してみましょう。
↓のようにインスタンスを作って、
:::python
car = Car()
↓のようにrun
メソッドを呼び出します。
:::python
car.run()
インスタンス変数からメソッドを呼び出すには、インスタンスにドット(.
)を付けて、メソッド名を書きます。
こうするとメソッドを呼び出すことができます。
メソッドを呼び出すと、先ほど作ったrun
メソッドが呼ばれます。
:::python
def run(self):
print('走ります!')
run
メソッドが呼ばれると、中に書かれているprint
が実行されます。
このとき、引数self
にはさきほどのインスタンス変数car
が入っています。
このように引数self
には、呼び出し元のインスタンスが入ります。
なので、たとえばrun
の他にhorn
(クラクション)というメソッドを作ったとします。
:::python
class Car:
def run(self):
self.horn()
def horn(self):
print('どけどけ! Car様のお通りだ!')
car = Car()
car.run()
↑のようにrun
メソッドからhorn
メソッドを呼ぶには、self
にドットを付けてhorn()
と書きます。
このように、self
を使うことで同じインスタンス内のメソッドやデータにアクセスできるようになります。
↑のコードの実行結果は↓のようになります。
どけどけ! Car様のお通りだ!
__init__
メソッドとは?
ここでクラスになくてはならないメソッドを紹介したいと思います。
その名も__init__
メソッドです。
このメソッドは、クラスからインスタンスが作られたときに自動で呼ばれます。
よって、例えば↓のように__init__
メソッドを書いて、
:::python
class Car:
def __init__(self):
print('インスタンスが作られました')
↓のようにインスタンス化します。
:::python
car = Car()
すると↓のような実行結果になります。
インスタンスが作られました
Car()
でインスタンスが作られるので、このときに__init__
メソッドが呼ばれて、print
が実行されます。
この__init__
メソッドは省略することができます。
また、こういったインスタンスを作るときに呼ばれるメソッドを、俗にコンストラクタともいいます。
C++などではコンストラクタいう呼び方が普通です。
コンストラクタを呼び出すことをコンストラクトするとも言います。「構築する」という意味です。
これの対義語でデストラクタ、デストラクトもあります。
__del__メソッドとは?
いっぽう、__del__
メソッドというのは、インスタンスが破棄されるときに呼ばれます。
たとえば↓のように__del__
メソッドを作ります。
:::python
class Car:
def __del__(self):
print('さよならァ!')
で、↓のようにインスタンスを作ります。
:::python
car = Car()
↑このインスタンスcar
を意図的に破棄するにはdel
文を使います。
↓のようにするとcar
を破棄できます。
:::python
del car
すると、先ほど作った__del__
メソッドが呼ばれます。
さよならァ!
このように__del__
メソッドはインスタンスが破棄されるときに呼ばれます。
他には、たとえば↓のように関数内でインスタンスを作ったとします。
:::python
def func():
car = Car()
func()
func
関数が終了すると、インスタンスcar
は自動的に破棄されます。
よって先ほどと同じように__del__
メソッドが呼ばれます。
クラスにインスタンス変数を作る
クラスのインスタンスには変数を持たせることも出来ます。
たとえば__init__
メソッド内で↓のようにします。
:::python
class Car:
def __init__(self):
self.name = 'サンダーローリング号'
self.weight = 100
self
にドットをつけて、変数名を書きます。
その変数に値を代入することでインスタンスに変数を持たせることができます。
このとき、この変数をインスタンス変数と言います。
インスタンスからインスタンス変数にアクセスするには、メソッドと同じようにドットでアクセスします。
:::python
car = Car()
print(car.name, car.weight)
↑のコードの実行結果は↓のようになります。
サンダーローリング号 100
インスタンス変数の値を変更することも可能です。
:::python
car.name = 'オンボロマニュアル車'
メソッド内でインスタンス変数にアクセスするには、同じようにself
にドットをつけます。
たとえば↓のようにrun
メソッド内でインスタンス変数にアクセスします。
:::python
class Car:
def __init__(self):
self.name = 'サンダーローリング号'
self.weight = 100
def run(self):
print(self.name + 'が走ります!')
self.weight = 200
インスタンス変数の値をインスタンスを作るときに指定できるようにする
さきほどのインスタンス変数は、__init__
メソッド内で決め打ちしてましたが、インスタンスを作るときに設定できると便利です。
そのようにしたい場合は↓のようにします。
:::python
class Car:
def __init__(self, name, weight):
self.name = name
self.weight = weight
__init__
メソッドに引数を加えて、その引数をインスタンス変数に代入しています。
これは定型文なのでそのまんま覚えましょう。
↓のようにすればインスタンスを作るときに変数の値をセットできます。
:::python
car = Car('豪速鉄球号', 500)
print(car.name, car.weight)
↑のコードの実行結果は↓のようになります。
豪速鉄球号 500
おわりに
クラスは機能が沢山あるのですが、今回は基本的な機能を紹介しました。
クラスを扱えるようになると、いろいろと現代的なプログラミングのテクニックや定石を使えるようになるので、覚えておきましょう。
また見てね