0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

(中学生向け・Python)クラスの基本①

Last updated at Posted at 2022-11-13

この記事は、岩手県八幡平市のプログラミング教室「アクセルキャンプ」の公開教材です。
アクセルキャンプ(フリースペースプラウド)のリンク
教材の作成依頼等も承っております。ご意見等は、リンク先の問い合わせ欄からお願いします。
教材の転用・利用等は自由です


安比のスキー場のシーズン券買っちゃったんだが

スキー一回もしたことないんだけど大丈夫かな?ていうか、いつ滑るねん!そこまで暇やないねん!ってなってるリッキーです。
image.png

ほな、なんでこうたん?てことですけど、買ったときはなんかテンション上がって、「今年はスキー頑張るぜ!」みたいになってたんですよ。皆さんは今年の冬はなにかこれをやろう!みたいなの決めてますか?サンタさんにお願いするものは決めてますか?

先に言っときます!!(キリッ)

今日やる内容ですが、コードを書いてればある程度は理解できるとは思いますが、「なんでコレが必要なの?」っていうのがなかなか伝わりにくい内容になってます。
例えるなら、お金でしょうか。「お金ってなんで必要なの?物と物を交換すればよくない?」って幼稚園児に聞かれて、しっかり説明するのって難しいけど、でもお金って超大事ですよね??
なるべくその辺をわかりやすく説明するつもりですが、「なんとなくわからんでもないけど、あとは使いながら覚えていこう」ていう理解でいいと思います。そんな感じで気楽に読んでくださいね!!

今日の主役:クラス (class)

みなさんは「クラス」という単語を聞いて、どういう意味を思い浮かべますか?真っ先に思いつくのが、学校の教室のことだと思います。八幡平では1学年に2クラスある小学校は一部の学校だけで、殆どは1学年1クラス、あるいは、複式学級のところもあったかもしれません。中学校はどうなんでしょう。そういう学校での人の まとまりのことを「クラス」といいますよね。

ただ、残念ながら(?)プログラミングにおいてはちょっと意味が変わってくるので一旦「クラス」の意味を整理しましょう。以後、クラスのことをclassと表記します。

class = データの設計図

みんな大好き、Nintendo Switchを作るプログラムを書いていくとしましょう。実際にSwitchをプログラムでポンと制作することはできないので、あくまで仮定の話です。
image.png

メンバーとメソッド

Switchを作るためには、いろんなデータが必要になります、例えば
・画面の縦・横の長さ
・ボタンの大きさ
・左コントローラの色
・右コントローラの色
・重さ

などなどです。これらの、Switchを作る際に登録する必要のあるデータを「メンバー」または、これらはクラスでは変数として扱われるため「メンバ変数」といいます。

また、Switchを作る際に、用意したデータを組み合わせたりして、いろんな機能をつけたりします。例えば
・ゲームを遊ぶ機能
・インターネットに接続する機能
・友達とチャットする機能
・購入したゲームを保存する機能
これらのことをメソッドといいます。メソッドはその性質から、処理をまとめた関数として扱われます。

Switch を作るクラスは、プログラム上では以下のようになります。なんとなく、コードっぽいものを書いているだけなので、当然このコードは動きません

#①クラスの書き方
class Nintendo_Switch:
    
    #②初期化:コンストラクタ
    def __init__(self, length_v, length_h, button_size, left_color, right_color, weight, saved_game):
        self.length_v  =length_v #縦方向の長さ
        self.length_h  = length_h #横方向の長さ
        self.button_size  = button_size #
        self.left_color  = left_color
        self.right_color  = right_color
        self.weight  = weidht
        self.saved_game = saved_game
    
    #③メソッド
    def playGame(self, game):
        if game in self.saved_game:
            game.play()
    
    def internet(self, wifi_id, wifi_password):
        if wifi_id and wifi_password:
            internet.connect()
    
    def chat(self, friend, message):
        message.sendToFriend()
    
    def buyGame(self, game):
        self.saved_game.append(game)

# ④インスタンス化
my_switch = Switch(800, 600, 20, "blue", "red", 420)
my_switch.playGame()

では、ざっくり部分部分を見ていきましょう。。。と言いたいところですが、その前に

self(セルフ)ってなんやねん

「セルフレジ」って言葉、聞いたことないですか?店員さんにお会計してもらうんじゃなくて 自分で「ピッ」ってやりながら会計するやつですね。あと、ガソリンスタンドとかで「セルフ給油」とかってみたことないですか?自分で入れるタイプのガソリンスタンドですね。

セルフには、「自分」とか「自身」とかっていう意味があります。↑の例以外でも
・himself = 彼自身の
・herself = 彼女自身の
・myself = 自分自身の
・selfish = 自己中心的な
のように、selfがつく単語は結構あります。

クラスの記述の中で、そのクラス自身のメンバーやメソッドをチェックしたい場合があります「Switchくん」が自分の構造を説明してくれているのを想像してください。 「ゲームを遊ぶ」機能を説明するときに「『俺の』ゲームリストの中にその遊びたいゲームがあったら、起動するぜ」みたいに説明するの、想像できますか?ここの『俺の』が、クラスで言うところのselfです。

では、順番に見ていきましょう。

クラスの構造

①クラスの書き方

class クラス名:
    def __init__(self, 引数1引数2):
        self.メンバー1 = 引数1
        self.メンバー2 = 引数2
        ...
    
    def メソッド名(self):
        処理

②初期化:コンストラクタ

Switchをいざ作ろう!というときに、
switch設計するぜ → switchの色わかんないぜ → switch製造するぜ
では困りますよね。そこで、
switch設計するぜ → switchの色は赤にするぜ → switch製造するぜ
のように、必要なデータ(メンバー)を整理するのに使うのが、この__init__の関数で、これのことを「コンストラクタ」と言います。

def __init__(self, length_v, length_h, button_size, left_color, right_color, weight, saved_game):
    self.length_v  =length_v #縦方向の長さ
    self.length_h  = length_h #横方向の長さ
    self.button_size  = button_size #ボタンの大きさ
    self.left_color  = left_color #左側コントローラの色
    self.right_color  = right_color #右側コントローラの色
    self.weight  = weidht
    self.saved_game = saved_game

引数としてもらってきたデータに、self.をつけることで、「俺のモンだぜ!クラス内で使うぜ!」と宣言している感じですかね。コレをすることによって各データがクラスに登録されて、後述の④のところで例えば
print(my_switch.length_v)
とすることで、ちゃんとその内容が表示されるようになります。ちなみに、引数を取らず、コンストラクターのところでデータを直接作成することもできます。

③メソッド

メソッドは、関数の形をとり、メンバーを組み合わせたりしていろんな処理をすることで、単にデータを整理するコンストラクタと違い、クラスに動きをつけてくれます。
...っていうかめっちゃ関数してますが、普通の関数と違うところは、必ず第一引数にselfが入っている点です。これはなんでこうしなくちゃいけないかって言うと、そうしなくちゃいけないからです笑 pythonを作ったグイド・ヴァンロッサムさんっていう人がいるんですが、「グイドさんに、なんでself書かなくちゃあかんの?って聞いてもあんまりよくわからんかった」っていう記事を見たことがあります笑「世の中そういうもんだ」と思って書いてください笑

# ゲームを開始するメソッド
def playGame(self,):
    if game in self.saved_game:
        game.play()
        
# インターネットに接続するメソッド
def internet(self, wifi_id, wifi_password):
    if wifi_id and wifi_password:
        internet.connect()
        
# チャットをするメソッド
def chat(self, friend, message):
    message.sendToFriend()

# ゲーム追加(購入)のメソッド
def purchaseGame(self, game):
    self.saved_game.append(game)

④インスタンス化

インスタンスとは、設計図(クラス)を見ながら、実際に作ったもの=製品のことをいいます。ここでは,my_switchという名前にしています。

my_switch = Switch(800, 600, 20, "blue", "red", 420)

さて、製品ができたので、製品のメンバーにどういうデータが入っているか確認したり、備わっている機能=メソッドを実行しましょう。

my_switch.playGame()

てなかんじです。


なんかめんどくさ!普通に関数だけでいいじゃん!

リッキーもはるか昔、クラスを勉強したてのときにそう思いました!でも、このクラスって 実際に使えるようになるとすごく便利というか、このクラスの考え方がすごく重要なんです。

今回出てきた用語を整理しましょう。

クラス:設計図
メンバー:クラスに必要なデータ
メソッド:機能
インスタンス:クラスをもとに作成されたもの

クラスを使えるようになると、ベースとなるクラスにメソッドを付け加えたり、改良したりすることができるんですが、まずは今回はここまで。次回、実際に動くコードでやってみましょう。

ではまた来週!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?