はじめに
早いもので今回が3回目です。
引き続きPythonについて学んでいきます。
前回の続きはこちら→ Pythonの基礎を学ぼう【#2】
環境はGoogle Colaboratoryを使います。
クラスとは?
今まで学んできたプログラムをもとに、ひとまとまりにして効率よく扱うために「クラス」という機能があります。「データの設計図」とも呼ばれ、データのパラメータや、どんな機能を持っているかが書いてあります。
クラスは前回登場した「関数」よりさらに大きい概念となり、関数を複数持つことが出来ます。
「変数」も一緒に持つことができ、イメージとしては「変数」+「関数」の集まりといえます。
実際に使ってみる
ここでは普通のスピードが出る黒色の車をクラスとして作ります。
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()
すると、delicious
がDELICIOUS
と大文字になって出力されます。
このtaste
はdelicious
という文字列データを持っている上で、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()
一見すると動きそうです…が
このコードを実行してみるとエラーが出ます。その理由はname
とage
を自分のクラスから
参照できていないためです。
クラス内の変数を呼び出すときは
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
を作ります。
キャラクターを作成する際、名前とレベルは共通で設定する変数になるため、親クラスを使うことで子クラスでもそのまま使えるようになります。
またオーバーライドと書いてありますが、これは親クラスで定義したメソッドを子クラスで上書きするという意味になります。
今回の場合、introduce
とattack
メソッドは魔法使いの表現に合わせています。
ここで問題!
「レベル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))
参考文献
この記事は以下の情報を参考にして執筆しました。