タートルグラフィックスを介してクラスに触れてみよう


タートルグラフィックスでクリックした場所に絵を描くパターンを増やしてみようの記事で作成したコードをクラスで整理してみよう。


クラスとは関数(クラス内ではメソッドと呼ぶ)やどのような値を持つのか?といった設計図のようなものになります。

今回はクラスの機能の内、メソッドに関する事のみを見ていきます。


今回整理する箇所は

# 移動した先で四角を描く
def draw_square():
␣␣␣␣for i in range(4):
␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣turtle.left(90)


# 移動した先で丸を描く
def draw_circle():
␣␣␣␣turtle.circle(30)


# 移動した先で三角を描く
def draw_triangle():
␣␣␣␣for i in range(3):
␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣turtle.left(120)


# 移動した先で星を描く
def draw_star():
␣␣␣␣for i in range(5):
␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣turtle.left(144)


# クリックした箇所にカメが移動する
def move_turtle(x, y):
␣␣␣␣turtle.penup()
␣␣␣␣turtle.goto(x, y)
␣␣␣␣turtle.pendown()
␣␣␣␣if x < 0 and y > 0:
␣␣␣␣␣␣␣␣draw_circle()
␣␣␣␣elif x > 0 and y > 0:
␣␣␣␣␣␣␣␣draw_square()
␣␣␣␣elif x < 0 and y < 0:
␣␣␣␣␣␣␣␣draw_triangle()
␣␣␣␣else:
␣␣␣␣␣␣␣␣draw_star()

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

の箇所になります。


上記の箇所をクラスでまとめてみます。

クラスを作る時にクラス名が必要になりますので、Drawerというクラス名にします。

※パイソンではクラス名を決める時はキャメルケースが良いとされています。

※例:クラス名でmy classというニュアンスにしたい場合はmyClassにする

※クラス名が英単語で1単語の時はパスカルケース(最初は大文字)が良いとされています。


これらの内容を踏まえた上で作成しましたコードが、

# 絵を描くためのメソッドをまとめたクラス
class Drawer:

␣␣␣␣# 移動した先で四角を描く
␣␣␣␣def draw_square(self):
␣␣␣␣␣␣␣␣for i in range(4):
␣␣␣␣␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣␣␣␣␣turtle.left(90)

␣␣␣␣# 移動した先で丸を描く
␣␣␣␣def draw_circle(self):
␣␣␣␣␣␣␣␣turtle.circle(30)

␣␣␣␣# 移動した先で三角を描く
␣␣␣␣def draw_triangle(self):
␣␣␣␣␣␣␣␣for i in range(3):
␣␣␣␣␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣␣␣␣␣turtle.left(120)

␣␣␣␣# 移動した先で星を描く
␣␣␣␣def draw_star(self):
␣␣␣␣␣␣␣␣for i in range(5):
␣␣␣␣␣␣␣␣␣␣␣␣turtle.forward(50)
␣␣␣␣␣␣␣␣␣␣␣␣turtle.left(144)

␣␣␣␣# クリックした箇所にカメが移動する
␣␣␣␣def move_turtle(self, x, y):
␣␣␣␣␣␣␣␣turtle.penup()
␣␣␣␣␣␣␣␣turtle.goto(x, y)
␣␣␣␣␣␣␣␣turtle.pendown()
␣␣␣␣␣␣␣␣if x < 0 and y > 0:
␣␣␣␣␣␣␣␣␣␣␣␣self.draw_circle()
␣␣␣␣␣␣␣␣elif x > 0 and y > 0:
␣␣␣␣␣␣␣␣␣␣␣␣self.draw_square()
␣␣␣␣␣␣␣␣elif x < 0 and y < 0:
␣␣␣␣␣␣␣␣␣␣␣␣self.draw_triangle()
␣␣␣␣␣␣␣␣else:
␣␣␣␣␣␣␣␣␣␣␣␣self.draw_star()

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

になります。


自作したクラス内の関数(メソッド)の書き方は今までのあまり変わりはないですが、すべてのメソッドの一番目の引数に自身を表す self が指定されています。


他にmove_turtleメソッド内にありますが、同一クラス内のメソッドを実行する時に

self.draw_circle()

のようにメソッド名の頭にself.が付いています。


この二点が自作のクラスを作成する上で重要になってきます。




クラスを踏まえた上で前回のコードを書き換えてみます。

import turtle


# 絵を描くためのメソッドをまとめたクラス
class Drawer:

    # 移動した先で四角を描く
    def draw_square(self):
        for i in range(4):
            turtle.forward(50)
            turtle.left(90)

    # 移動した先で丸を描く
    def draw_circle(self):
        turtle.circle(30)

    # 移動した先で三角を描く
    def draw_triangle(self):
        for i in range(3):
            turtle.forward(50)
            turtle.left(120)

    # 移動した先で星を描く
    def draw_star(self):
        for i in range(5):
            turtle.forward(50)
            turtle.left(144)

    # クリックした箇所にカメが移動する
    def move_turtle(self, x, y):
        turtle.penup()
        turtle.goto(x, y)
        turtle.pendown()
        if x < 0 and y > 0:
            self.draw_circle()
        elif x > 0 and y > 0:
            self.draw_square()
        elif x < 0 and y < 0:
            self.draw_triangle()
        else:
            self.draw_star()


d = Drawer()
turtle.shape("turtle")

screen = turtle.Screen()
screen.onclick(d.move_turtle)
screen.listen()
turtle.done()

新たに触れましたクラス関連で追加したコードは太字の箇所になりまして、

d = Drawer()
変数 = クラス名()

でクラスで書かれた設計図を基にして、オブジェクトを生成するという処理になります。

クラス名の後に()を付ける事でコンストラクタ関数と呼ばれる機能を使うことになります。


生成されたオブジェクト内のメソッドを使う時は

オブジェクトが格納された変数.クラス内で書いたメソッド

になりまして、draw_squareメソッドを使いたい時は

d.draw_square()

になります。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。