제로베이스 데이터 취업 스쿨 2주차 스터디노트 3호
갑자기 무슨 카레이서냐고? 갑자기 왜 2편?
제 인생 회고를 들어주세요.
우리는 카레이서가 되어야 한다.
카레이서가 되기 위해,
오늘은 운전자, 전문가 클래스를 만들어서 다중상속을 해보자.
(설계 오졌다.)
해당 포스트는 실패한 접근 또한 다루고 있습니다.
class Driver:
def speak_as_driver(self):
return "I'm the driver. I make choice, and take responsibility."
class Professional:
def __init__(self, att_lv):
self.pro_attitude_lv = att_lv
def forge_oneself(self):
self.pro_attitude_lv += 1
def speak_as_professional(self):
return f"My pro-attitude level is {self.pro_attitude_lv}"
class CarRacer(Professional, Driver):
def __init__(self, name, job, att_lv):
super().__init__(att_lv)
self.name = name
self.job = job
def speak_as_car_racer(self):
return f"I win the race. I'm car racer {self.name}."
brand_new_me = CarRacer("Cape", "Data Scientist", 3)
brand_new_me.speak_as_driver()
brand_new_me.pro_attitude_lv
brand_new_me.forge_oneself()
brand_new_me.pro_attitude_lv
brand_new_me.speak_as_professional()
brand_new_me.speak_as_car_racer()
최초에는 상당히 성대하게 접근했다.
하지만 MRO (Method Resolution Order)이라는 개념에 가로막혔다.
다음 두 페이지를 참고하면 좋을 듯 하다.
How does Python's super() work with multiple inheritance?
다중상속, 메소드 오버라이딩, Super
요약
class Driver(Human):
def __init__(self, name, job, d_msg):
Human.__init__(self, name, job) # 무조건 super로 호출하는게 아니라, 클래스를 지정해서 호출해줘야 하는 경우도 있다.
self.driver_message = d_msg
self.degree = 0
전체 내용
class Human:
def __init__(self, name, job):
self.name = job
self.job = job
class Driver(Human):
def __init__(self, name, job, d_msg):
Human.__init__(self, name, job)
self.driver_message = d_msg
self.degree = 0
def steer_left(self, degree):
self.degree -= degree
def steer_right(self, degree):
self.degree += degree
def get_driver_message(self):
return self.driver_message
class Professional(Human):
def __init__(self, name, job, p_msg):
Human.__init__(self, name, job)
self.professional_message = p_msg
self.pro_attitude = False
def forge_oneself(self):
self.pro_attitude = True
def get_professional_message(self):
return self.professional_message
class CarRacer(Driver, Professional):
def __init__(self, name, job, d_msg, p_msg, cr_msg):
Driver.__init__(self, name, job, d_msg)
Professional.__init__(self, name, job, p_msg)
self.car_racer_message = cr_msg
def get_car_racer_message(self):
return self.car_racer_message
설계 오졌다고 좋아하다가 MRO라는 듣도 보도 못한 개념에 얻어터졌다.
역시 사람은 건방떨면 안된다.