Pythonの基礎知識⑤です。
引き続き自分の勉強メモです。
過度な期待はしないでください。
過去投稿記事
Python基礎
Python基礎②
Python基礎③
Python基礎④
継承
-既にあるクラスを元にして新たなクラスをつくること
「class 新しいクラス名(元となるクラス名):」
とすることで他のクラスを継承して、
新しいクラスを定義することが出来る。
新しいクラスは「子クラス」、元となるクラスは「親クラス」と呼ばれます。
menu_item.py
# 親クラス
class MenuItem:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + ': ¥' + str(self.price)
def get_total_price(self, count):
total_price = self.price * count
if count >= 3:
total_price *= 0.9
return round(total_price)
sweets.py
# 子クラス
# menu_item.pyからMenuItemクラスを読み込む
from menu_item import MenuItem
# 他のクラスを継承して、新しいクラスを定義
class Sweets(MenuItem):
pass # 何も処理がない事を表す
# インデントを揃える(半角スペース4つ分)
-子クラスのインスタンスメソッド
子クラスは「親クラス内に定義されているメソッド」と「独自に定義したメソッド」の両方が使える。
しかし、親クラスでは子クラスのメソッドは使えない。
sweets.py
# 子クラス
from menu_item import MenuItem
class Sweets(MenuItem):
def calorie_info(self): # メソッドの定義には、第1引数にselfを追加する
print(str(self.calorie) + 'kcalです') # str()で数値を文字列に変換
# インデントを揃える(半角スペース4つ分)
-オーバーライド 親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドが上書きされる。 要は、子クラスで定義したメソッドが優先して呼び出されるようになっている。
menu_item.py
# 親クラス
class MenuItem:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + ': ¥' + str(self.price)
def get_total_price(self, count):
total_price = self.price * count
if count >= 3:
total_price *= 0.9
return round(total_price)
sweets.py
from menu_item import MenuItem
class Food(MenuItem):
# infoメソッドを定義
def info(self):
return self.name + ': ¥' + str(self.price) + str(self.calorie) + 'kcal'
def calorie_info(self):
print(str(self.calorie) + 'kcalです')
親クラスにある infoメソッドではなく、子クラスにある infoメソッドが優先されて上書きされる
メソッド内の重複
-「super().メソッド名()」
とすることで、
親クラス内に定義されたインスタンスメソッドをそのまま利用することが出来る。
menu_item.py
# 親クラス
class MenuItem:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + ': ¥' + str(self.price)
def get_total_price(self, count):
total_price = self.price * count
if count >= 3:
total_price *= 0.9
return round(total_price)
sweets.py
from menu_item import MenuItem
class Food(MenuItem):
def __init__(self, name, price):
# super()を用いて、親クラスの__init__()を呼び出す
super().__init__(name, price)
# self.name = name → 重複している部分は削除
# self.price = price → 重複している部分は削除
def info(self):
return self.name + ': ¥' + str(self.price) + str(self.calorie) + 'kcal'
def calorie_info(self):
print(str(self.calorie) + 'kcalです')