#Pythonで多重継承
多重継承するサンプルコードは以下の通り。
samplePython.py
#
# 2020.07.25 ProOJI
#
# 人は話す
class Person(object):
def talk(self):
print('talk.')
# 車は走る
class Car(object):
def run(self):
print('run.')
# ロボットは飛ぶ
class PersonCarRobot(Person, Car):
def fly(self):
print('fly.')
# インスタンス生成
person_car_robot = PersonCarRobot()
person_car_robot.talk()
person_car_robot.run()
person_car_robot.fly()
# 出力結果
# talk.
# run.
# fly.
class Person
とclass Car
を継承すると
class PersonCarRobot
になります。
ここまでは普通。
さてここで同じメソッドを継承した場合どうなるのか実験してみました。
そもそも人も走るものですので、class Person
にもrunを作成してみました。
以下のようにコードを修正しました。
# 人は話す そして走る
class Person(object):
def talk(self):
print('talk.')
""" ここを追加 """
def run(self):
print('Person-Run.')
# 車は走る
class Car(object):
""" 同じ runメソッド となり重なってしまう """
def run(self):
print('Car-Run.')
この場合の出力結果は、
# 人は話す そして走る
class Person(object):
def talk(self):
print('talk.')
def run(self):
print('Person-Run.')
# 車は走る
class Car(object):
def run(self):
print('Car-Run.')
# ロボットは飛ぶ
class PersonCarRobot(Person, Car):
def fly(self):
print('fly.')
# インスタンス生成
person_car_robot = PersonCarRobot()
person_car_robot.talk()
person_car_robot.run()
person_car_robot.fly()
# 出力結果
# talk.
# Person-Run.
# fly.
##多重継承のクセとして…
多重継承の結果として、同じメソッドを作成して重複する場合
# ロボットは飛ぶ
class PersonCarRobot(Person, Car): # <=左側のPersonが優先
左側のPerson内にあるrun
が実行されCar内のrun
は実行されません。
試しに左右を逆にしてみると、
# ロボットは飛ぶ
class PersonCarRobot(Car, Person):# <=左側のCarが優先
def fly(self):
print('fly.')
# 出力結果
# talk.
# Car-Run.
# fly.
となりました。
#まとめ
クラスを継承する際には、このクセを理解した上で進めることが必要かなと思いました。
できるだけ多重にならない継承を心がけた方がバグに繋がらないので、設計段階で気をつけることも必要かとも思いました。ただコードの量も増えてくるとどうしてもこういうケースも出没するかもしれません。気をつけないと…