タートルグラフィックスでコンストラクタに触れてみよう

コンストラクタとは、クラスから新しいオブジェクトの生成時に自動で読み込まれるメソッドを指します。

上記の説明ではイメージしづらいので、実際のコードを見てみます。


import turtle


class SquareDrawer:

␣␣␣␣# 四角の大きさのクラス変数
␣␣␣␣square_size = 0

␣␣␣␣def __init__(self):
␣␣␣␣␣␣␣␣self.square_size = 50

␣␣␣␣# 四角を描く
␣␣␣␣def draw(self):
␣␣␣␣␣␣␣␣for i in range(4):
␣␣␣␣␣␣␣␣␣␣␣␣turtle.forward(self.square_size)
␣␣␣␣␣␣␣␣␣␣␣␣turtle.left(90)

␣␣␣␣# 四角の大きさを設定する
␣␣␣␣def set_size(self, s):
␣␣␣␣␣␣␣␣self.square_size = s

␣␣␣␣def done(self):
␣␣␣␣␣␣␣␣turtle.done()


if __name__ == "__main__":
␣␣␣␣turtle.shape("turtle")
␣␣␣␣d = SquareDrawer()
␣␣␣␣d.draw()
␣␣␣␣d.done()

※␣は半角スペース1個分


上のコードでコンストラクタは

def __init__(self):
␣␣␣␣self.square_size = 50

※␣は半角スペース1個分

の箇所になります。


SquareDrawerクラスのクラス変数で四角のサイズを 0 にし、末尾の四角を書く為のコードで一度も四角のサイズを変更するコードはありませんが、

実行結果ではサイズが 50 の四角を描いています。

何処でサイズを変更したか?というと、__init__メソッド内でサイズを変更するコードがあります。


では、__init__メソッドはいつ実行されたのでしょうか?

__init__メソッドの実行のタイミングは、

d = SquareDrawer()

SquareDrawerオブジェクトの生成時になります。


オブジェクト生成時に基になるクラスに__init__メソッドがある場合は__init__メソッドが自動で実行されます。




__init__メソッドを用意しておきますと、下記のような事ができるようになります。

class SquareDrawer:

␣␣␣␣# 四角の大きさのクラス変数
␣␣␣␣square_size = 0

␣␣␣␣def __init__(self, size):
␣␣␣␣␣␣␣␣if size > 0:
␣␣␣␣␣␣␣␣␣␣␣␣self.square_size = size
␣␣␣␣␣␣␣␣else:
␣␣␣␣␣␣␣␣␣␣␣␣self.square_size = 50

※␣は半角スペース1個分

に変更して、オブジェクトの生成の箇所を

d = SquareDrawer(100)

これで、オブジェクトの生成時に四角のサイズを決める事ができるようになりました。


ただ、このコードではオブジェクトの生成時に毎回四角のサイズを決めるのが大変なので、

class SquareDrawer:

␣␣␣␣# 四角の大きさのクラス変数
␣␣␣␣square_size = 0

␣␣␣␣def __init__(self, size=0):
␣␣␣␣␣␣␣␣if size > 0:
␣␣␣␣␣␣␣␣␣␣␣␣self.square_size = size
␣␣␣␣␣␣␣␣else:
␣␣␣␣␣␣␣␣␣␣␣␣self.square_size = 50

※␣は半角スペース1個分

__init__メソッドの引数に初期値を設けて、

d = SquareDrawer()

でオブジェクトを生成した時の size の値は 0 にして、

d = SquareDrawer(100)

でオブジェクトを生成した時の size の値は 100 といった形で指定できるようにします。

同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。