우리는 카레이서가 되어야 한다. (2편)

I'm Cape·2023년 5월 11일
0

제로베이스 데이터 취업 스쿨 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라는 듣도 보도 못한 개념에 얻어터졌다.
역시 사람은 건방떨면 안된다.

profile
Impact

0개의 댓글