概要
Udemyで酒井潤さんの講座を学習させてもらった際によくわからない部分があったので残したいと思います。
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
以下のようなコードがあります
class Person(object):
def __init__(self, age = 1):
self.age = age
def drive(self):
if self.age >= 18:
print('OK')
else:
raise Exception('No')
class Baby(Person):
def __init__(self, age=1):
if age < 18:
super().__init__(age)
else:
raise ValueError
class Adult(Person):
def __init__(self, age=18):
if age >= 18:
super().__init__(age)
else:
raise ValueError
baby = Baby()
adult = Adult()
class Car(object):
def __init__(self, model=None):
self.model = model
def run(self):
print('run')
def ride(self, person):
person.drive()
car = Car()
car.ride(adult)
ここでCarクラスから作成されたcarオブジェクトでrideメソッドを、adultを引数として渡して呼び出しますよね。
実行すると以下の結果になると思います。
OK
プロセスは終了コード 0 で終了しました
ここで何故エラーにならずOKが正しく出力されるか直感的によくわかりませんでした。
それで調べてみるとすごく単純なことでした。
rideメソッドの()内に記載されているpersonって渡された引数を受け取る文字列のような役割だったということです。
Personクラスがあるのでそちらと関連付けてごっちゃになってしまいましたけど、要するにpersonの部分がalienでもmonsterでも成立するわけですね。
つまりcarオブジェクトでrideメソッドを実行する際は引数としてadultを渡していましたが、これがCarクラスのrideメソッドのpersonに格納されるわけということです。
実質的には adult.drive が実行されているような感じでそれなら結果としてOKが出力されるのも納得いきました。