唯々諾々 (しません)

冷静な議論ができる方からのマサカリは大歓迎です。

クラスとインスタンスの違い (アルセウスとまわるオブジェクト指向プログラミング)

やって参りました、ポケモンと回るIT界隈。3回目の今回は「クラスとインスタンス」です。 私も完全に理解してますかと言われたらNoなので理性的なマサカリは大歓迎です。


クラスとインスタンス (オブジェクト) には様々なたとえ話があります。たい焼き器や車などです。しかしこれらにはそれぞれ問題があります; まずたい焼き器をクラスとするインスタンスであるたい焼きには「食べられる」以外のメソッドが考えにくくなります。メソッドまで含めてのクラスですから、これはすこし不十分と言わざるを得ません。次に車です。これは人によりますが、鋳型をクラスとして想像してしまい、1つの鋳型からは1つの車種しか作れないことからインスタンスとクラスの違いが不明瞭になってしまうことがあるのではないかと思っています (少なくとも私はそうでした)。

そこで私は考えました。ポケモンで説明しよう、と。

今回の案はこちらの動画と記事にインスパイアされております。

youtu.be

trance-cell.com

アルセウスポケモンを作る

ある日のこと、アルセウス社長は2022年発売のポケモンスカーレット・バイオレットの発売に向けてポケモンを新たにデザインしていました。アルセウス社長は賢いので、今までのポケモンもクラスを作ってそのインスタンスとして作成していました。次のようなクラスです。

class Pokemon:
    def __init__(self, pokemon_id, name, type1, type2, level, waza):
        self.pokemon_id = pokemon_id
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.level = level
        self.waza = waza  # waza: list, len(waza) == 4


    def self.act_waza1(self):
        # 1番目の技を繰り出す

    def self.generate(self):
        # 進化する

    def self.remember_waza(self):
        # 技を覚える

これがざっくりながら「Pokemon クラス」です。クラスは単体では実体をなしませんインスタンスとして初期化して (ポケモン界に生み出して) 初めて実体を持ちます。
例えばフシギダネを作る際には

Pochi = Pokemon(0, 'Bulbasaur', 'glass', 'poison',
5, ['たいあたり', 'なきごえ', 'つるのムチ', ''])

などとします。

しかし今回SVではテラスタイプというものが実装されるではありませんか、アルセウスは慌てて次のようにPokemon クラスを書き換えました。

class Pokemon_SV:
    def __init__(self, pokemon_id, name, type1, type2, tera_type, level, waza):
        self.pokemon_id = pokemon_id
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.tera_type = tera_type
        self.level = level
        self.waza = waza  # waza: list, len(waza) == 4


    def.self.terastal(self):
        # テラスタルする

    def self.act_waza1(self):
        # 1番目の技を繰り出す

    def self.generate(self):
        # 進化する

    def self.remember_waza(self):
        # 技を覚える

ラスタルに関する部分が増えていることにお気づきかと思います (ほんとは多分継承とかなんとか使ってベタ書きしないほうがいい)。SVでのポケモン (インスタンス) はすべてこの Pokemon_SV クラスを用いて作ることができます。これがクラスの利点です。

以上がざっくりながらクラスとインスタンスの違いとその利点でした。ご参考になれば幸いです。