0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonの基礎を学ぼう【#3】

Posted at

はじめに

早いもので今回が3回目です。
引き続きPythonについて学んでいきます。
前回の続きはこちら→ Pythonの基礎を学ぼう【#2】
環境はGoogle Colaboratoryを使います。

クラスとは?

今まで学んできたプログラムをもとに、ひとまとまりにして効率よく扱うために「クラス」という機能があります。「データの設計図」とも呼ばれ、データのパラメータや、どんな機能を持っているかが書いてあります。
クラスは前回登場した「関数」よりさらに大きい概念となり、関数を複数持つことが出来ます。
「変数」も一緒に持つことができ、イメージとしては「変数」+「関数」の集まりといえます。

クラスの説明.png

実際に使ってみる

ここでは普通のスピードが出る黒色の車をクラスとして作ります。

class car:
    color = "black" #メンバ変数
    def speed(self): #メソッド
        return "normal"

次にcarクラスを使うためにインスタンス化します(carという変数に入れる)

car = car()

次にcarクラスの中身を確認します。すると先ほど作ったクラスの内容が表示されます。

print(car.color)
print(car.speed())

ここで問題!

foodクラスを作りなさい。ただし、メンバ変数をtaste(味), メソッドをcalorie(カロリー)とする。
変数やメソッドの内容は自由とする。

解答はこちら(解いてから見る)

一般的なおにぎり一個が170kcal程度とのこと。

class food:
    taste = "delicious" #メンバ変数
    def calorie(self): #メソッド
        return "170kcal"

オブジェクト(もの)について

オブジェクトとは「データとメソッドのセット」を表します。
例えば下記コードを実行します。

taste = "delicious"
taste.upper()

すると、deliciousDELICIOUSと大文字になって出力されます。

このtastedeliciousという文字列データを持っている上で、upperというメソッドも持っています。これがオブジェクトになります。
もちろんクラスも変数とメソッドを持っているのでオブジェクトと呼ぶことが出来ます。

selfの意味

先ほどのcarクラスをもう一度確認します。

class car:
    color = "black" #メンバ変数
    def speed(self): #メソッド
        return "normal"

このメソッドで出てくるselfは何なのでしょうか?

そこで理解を深めるために、このselfを使用したpersonクラスを作ります。

class person:
  name = "taro"
  age = "15"
  def introduce(self):
    print(f"My name is {name} and I am {age} years old.")
person = person()
person.introduce()

一見すると動きそうです…が
このコードを実行してみるとエラーが出ます。その理由はnameageを自分のクラスから
参照できていないためです。

クラス内の変数を呼び出すときは

class person:
  name = "taro"
  age = "15"
  def introduce(self):
    print(f"My name is {self.name} and I am {self.age} years old.")

とこのようにselfを使うことによって自身の変数を利用できるようになります。
この名前はself以外の名前でも動きますが、読みやすさも含めて統一しておくのがおすすめです。

__init__メソッドを使う

クラスでよく見るこのメソッド。Pythonではコンストラクタやイニシャライザと呼ばれたりします(他の言語では区別されていたりする)。ざっくり一言で表すと「初期設定用の関数」となります。例えば先ほどのpersonクラスを

class person:
    def __init__(self, name, age):
        self.name = name      # nameを初期化
        self.age = age        # ageを初期化

    def introduce(self):
        print(f"My name is {self.name} and I am {self.age} years old.")

__init__を使ってこのように表すことが出来ます。

ここで問題!

taroさん、jiroさん、saburoの力を借ります。
上記のpersonクラスを使って3名を呼び出し、それぞれ自己紹介をさせなさい。
(年齢は自由です。)

解答はこちら(解いてから見る)

これで全員の自己紹介が出来ました。

class person:
    def __init__(self, name, age):
        self.name = name      # nameを初期化
        self.age = age        # ageを初期化

    def introduce(self):
        print(f"My name is {self.name} and I am {self.age} years old.")
person1 = person("taro", 10)
person2 = person("jiro", 20)
person3 = person("saburo", 30)
person1.introduce()
person2.introduce()
person3.introduce()

引き継がれし能力「継承」

ここまでクラスを作成して効率よくコードをかけるようになってきました。
さらにここからは親クラスと子クラスの考え方を身につけていきます。親クラスの機能を子クラスに引き継がせることで共通した部分はそのまま利用し、そこから派生させることが可能になります。
例えば

# 親クラス(スーパークラス)を定義
class Hero:
    def __init__(self, name, level):
        self.name = name
        self.level = level
    
    def introduce(self):
      print(f"私は勇者の{self.name}です。レベルは{self.level}です。")

    def attack(self):
        print(f"{self.name}は攻撃!")


# 子クラス(サブクラス)を定義し、親クラスのメソッドをオーバーライド
class Wizard(Hero):
    def introduce(self):
        print(f"私は魔法使いの{self.name}です。レベルは{self.level}です。")

    def attack(self):
        print(f"{self.name}はファイアボールを唱えた!")

このようにHeroという親クラスと、その親クラスを継承したWizardを作ります。
キャラクターを作成する際、名前とレベルは共通で設定する変数になるため、親クラスを使うことで子クラスでもそのまま使えるようになります。

またオーバーライドと書いてありますが、これは親クラスで定義したメソッドを子クラスで上書きするという意味になります。
今回の場合、introduceattackメソッドは魔法使いの表現に合わせています。

ここで問題!

「レベル50の勇者シロ」と「レベル60の魔法使いクロ」を召喚したい。上記コードを使って自己紹介と攻撃文を表示させなさい。

解答はこちら(解いてから見る)

便利な継承。使っていきましょう。

hero = Hero("シロ", 50)
hero.introduce() 
hero.attack() 
wizard = Wizard("クロ", 60)
wizard.introduce()
wizard.attack()

★最終問題★

継承で使ったコードを参考に自分の好きな親クラス、子クラスを1つずつ作成せよ。

便利な標準ライブラリ紹介

datetime(ZoneInfo利用)

現在時刻を取得したいときに使用。

from datetime import datetime
from zoneinfo import ZoneInfo

now = datetime.now(ZoneInfo("Asia/Tokyo"))
print("現在の日時(JST):", now)

time

特にWebスクレイピングやAPI通信(データをやり取りするための仕組み)を行う際、過度なアクセスによるサーバーへの負荷を防ぐためにtime.sleepを使用する。

import time

print("3秒待つ…")
time.sleep(3)
print("再開!!")

random

このコードでは1から100までのランダムな整数を生成する。ランダムな数字を使うゲームをプログラムする際によく使う。

import random

random_int = random.randint(1, 100)
print("ランダムな整数:", random_int)

calendar

年や月単位のカレンダーを表示できる。「あの日何曜日だっけ…」という疑問をコード書きながらさっと解決することが出来る。

import calendar
calendar.prcal(2025) 
print(calendar.month(2025, 6))

参考文献

この記事は以下の情報を参考にして執筆しました。

確かな力が身につくPython「超」入門 (確かな力が身につく「超」入門シリーズ)

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?