良書と言われる「オブジェクト指向設計ガイド」からオブジェクト指向の理解を深め中。
今回は7&8章から多重継承とコンポジションを掘り下げ
# スーパークラス
class SuperClass:
def __init__(self):
self.a = 1
# SuperClassを継承したサブクラス
class SubClass(SuperClass):
def __init__(self):
super().__init__()
self.b = 2
obj = SubClass()
print(obj.a + obj.b) # --> 3
Dクラスのインスタンスに対してhelloメソッドを呼び出すと、継承の流れでオーバーライドされたAクラスとCクラスのどちらのhelloメソッドが呼び出されるか?という問題
継承階層が構成される際に、どのメソッドが呼び出されるかや同じクラス(この場合はAクラス)がメソッド解決時に何度も登場することが問題になる
class A:
def hello(self):
print('Aから呼び出し')
class B(A):
pass
class C(A):
def hello(self):
print('Cから呼び出し')
# BとCを派生させる
class D(B, C):
pass
d = D()
d.hello()
# 出力されるのは A? C?
class Person:
def __init__(self, name):
self.name = name
# 公式の予定
# ※Person を継承するので単体では機能しない
class OfficialMixin:
def schedule(self):
return self.name + 'は勉強会に参加します'
# 本当の予定
# ※Official を継承するので単体では機能しない
class SecretMixin:
def schedule(self):
return super().schedule() + ' という嘘をついて、遊びに行きます'
# Person と OfficialMixin のみをミックスイン
class FakeSchedule(Person, OfficialMixin):
pass
# Person と OfficialMixin と SecretMixin をミックスイン
class TrueSchedule(Person, SecretMixin, OfficialMixin):
pass
public = FakeSchedule('山田')
print("公式の予定:"+ public.schedule())
# --> 公式の予定:山田は勉強会に参加します
private = TrueSchedule('山田')
print("本当の予定:"+ private.schedule())
# --> 本当の予定:山田は勉強会に参加します という嘘をついて、遊びに行きます
official = OfficialMixin() # --> エラー
official.schedule('山田')
# --> Personから名前を継承していないので単体で使えない
# 給料クラス
class Salary:
def __init__(self, monthly_income):
self.monthly_income = monthly_income # 月収
# 年収
def get_total(self):
return (self.monthly_income * 12)
# 年俸クラス
class AnnualSalary:
def __init__(self, monthly_income, bonus):
self.monthly_income = monthly_income # 月収
self.bonus = bonus # ボーナス
self.obj_salary = Salary(self.monthly_income) # 給料インスタンス
# 年俸
def annual_salary(self):
return "合計: ¥" + str(self.obj_salary.get_total() + self.bonus)
# 社員の年俸(月収, ボーナス)
obj_emp = AnnualSalary(380000, 500000)
# 合計の年俸を出力
print(obj_emp.annual_salary())
# --> 合計: ¥5060000