SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

レトロ風ゲームを作って学ぶPython入門

【作って学ぶPython】クラスとスプライトを学んでメンテナンスしやすいコードを書こう!

レトロ風ゲームを作って学ぶPython入門 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

クラス変数とクラス メソッド

 クラスは、インスタンスを作らなくても、そのまま使える変数とメソッドを定義できます。こうした変数やメソッドのことを、クラス変数クラス メソッドと呼びます。

 クラス変数やクラス メソッドは、クラス全体で利用する値や処理として書きます。

クラス変数とクラス メソッド
クラス変数とクラス メソッド

 クラス変数は、class文でインデントしたところに直接書きます。クラス メソッドは、@classmethodを付けてメソッドを書きます。このとき、第1引数はクラス自身を表すclsにします。

 インスタンス メソッドから、クラス変数やクラス メソッドを利用するときは、self.~で書きます。

 実際にどのようなものか、Pythonのプログラムで見てみましょう。classmethod_1.pyというファイルを作って、プログラムを書いて実行します。

classmethod_1.py
class Chara2:
     MIN_AGE = 0     # クラス変数
     MAX_AGE = 100   # クラス変数

     @classmethod
     def check_age(cls, age):    # クラス メソッド
         if age < cls.MIN_AGE: return False
         if age > cls.MAX_AGE: return False
         return True

     def __init__(self):         # コンストラクター
         self.age = 0

     def set_age(self, age):     # インスタンス メソッド
         if self.check_age(age): # クラス メソッドを使用
             print("OK")
         else:
             print(f"警告 age: {self.MIN_AGE}-{self.MAX_AGE}")  #クラス変数を使用
         self.age = age  # インスタンス変数を使用

print(Chara2.MIN_AGE)   # 「0」と表示
print(Chara2.MAX_AGE)   # 「100」と表示

print(Chara2.check_age(-1))     # 「False」と表示
print(Chara2.check_age(16))     # 「True」と表示
print(Chara2.check_age(101))    # 「False」と表示

chara2 = Chara2()
chara2.set_age(20)      # 「OK」と表示
chara2.set_age(200)     # 「警告 age: 0-100」と表示

継承

 多くのプログラミング言語で、クラスは継承をおこなえます。継承とは、元のクラスの機能を引き継いだ派生クラスを作ることです。このとき、元のクラスを親クラス、派生したクラスを子クラスと呼びます。

 現実世界の製品でたとえれば、ハンバーガーから派生したチーズバーガーを作るようなことです。

 クラスの継承をおこなうと、子クラスからは、親クラスの変数やメソッドが使えます。その上で子クラスでは、新しい変数やメソッドを付け足したり、親クラスが持つメソッドの機能を変えたりできます。

 Pythonのクラスで継承をおこなうときは、class文のあとに( )を書き、その中に親クラスを書きます。プログラミング言語によっては、親クラスは1つしか指定できませんが、Pythonでは複数指定できます。複数の親クラスを書くときは、( )の中に,区切りで書きます。

 親クラスのメソッドの機能を変更したいときは、オーバーライド(上書き)をおこないます。メソッドのオーバーライドは、同名のメソッドを書けばよいです。

 オーバーライドしたメソッドの中で親クラスのメソッドを利用したいときは、super()関数を使います。この使い方はのちほど例の中で示します。

 Pythonのクラスの継承が、実際にどのようなものかプログラムで見てみましょう。inheritance_1.pyというファイルを作り、プログラムを書いて実行します。

inheritance_1.py
# 親クラス
class Chara:
    # コンストラクター
    def __init__(self, name):
        self.name = name

    # インスタンス メソッド
    def get_prof(self):
        res = f"{self.name}"
        return res

    # インスタンス メソッド
    def get_name(self):
        return self.name

# 子クラス
class Hero(Chara):
    # コンストラクター
    def __init__(self, name, hp):
        # super()で、親クラスのメソッドを使う
        super().__init__(name)
        self.hp = hp    # インスタンス変数を追加

    # オーバーライド
    def get_prof(self):
        # super()で、親クラスのメソッドを使う
        res = f"{super().get_prof()} {self.hp}"
        return res

    # 新しいメソッド
    def is_alive(self):
        return self.hp > 0

hero = Hero("勇者", 10)
print(hero.get_prof())  # 「勇者 10」と表示
print(hero.is_alive())  # 「True」と表示

 super().親クラスのメソッド()と書くことで、親クラスのメソッドを利用できます。super().__init__()ならコンストラクターを利用できます。

 上の例のsuper().__init__(name)は、クラス名を使いChara.__init__(self, name)と書くこともできます。

 また、super().get_prof()は、クラス名を使いChara.get_prof(self)と書くこともできます。

クラスの継承
クラスの継承

次のページ
型ヒント

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
レトロ風ゲームを作って学ぶPython入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19460 2024/07/17 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング