0
0

More than 3 years have passed since last update.

Python:クラスで多重継承

Posted at

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 Personclass 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.

となりました。

まとめ

クラスを継承する際には、このクセを理解した上で進めることが必要かなと思いました。
できるだけ多重にならない継承を心がけた方がバグに繋がらないので、設計段階で気をつけることも必要かとも思いました。ただコードの量も増えてくるとどうしてもこういうケースも出没するかもしれません。気をつけないと…

0
0
2

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
0