회원가입

7. [상속] 상속 III (mro)

NULL 2021-10-11

mro 메서드


그 클래스가 상속받는 부모 클래스들이 순서대로 담긴 리스트를 리턴한다.

 

오버라이딩mro 메서드와 관련이 깊다.

 

파이썬에서는 물려받은 메서드와 같은 이름의 메서드를 다시 정의해서 오버라이딩을 한다.

그럼 자식 클래스는 물려받은 메서드오버라이딩메서드 둘 다 있다.

 

어떻게 오버라이딩메서드가 호출될까?

그것은 바로 메서드를 호출하면 파이썬이 mro 에 나와 있는 순서대로 메서드를 탐색하기 때문이다.

 

그러니까 mro 에서 앞에 나오는 자식 클래스메서드가 뒤에 나오는 부모 클래스의 같은 이름의 메서드 보다 먼저 찾아져서 호출되는 것이다.

 

코드로 예제를 보자.

class Employee:
    """직원 클래스"""
    # 가게 이름
    company_name = "코드잇 버거"
    # 시급 인상률
    raise_percentage = 1.03

    def __init__(self, name, wage):
        """인스턴스 변수 설정"""
        self.name = name
        self.wage = wage

    def raise_pay(self):
        """시급을 인상한다."""
        self.wage *= self.raise_percentage

    def __str__(self):
        """직원 정보를 문자열로 리턴하는 메서드"""
        return Employee.company_name + " 직원: " + self.name

class Cashier(Employee):
    """계산대 직원 클래스"""
    # 햄버거 가격
    burger_price = 4000
    raise_percentage = 1.05

    def __init__(self, name, wage, number_sold=0):
        super().__init__(name, wage)
        self.number_sold = number_sold

    def take_order(self, money_received):
        if Cashier.burger_price > money_received:
            print("돈이 충분하지 않습니다.")
            return money_received
        else:
            self.number_sold += 1
            change = money_received - Cashier.burger_price
            return change

    def __str__(self):
        return Cashier.company_name + " 계산대 직원: " + self.name

현재 Cashier 클래스는 Employee 클래스를 상속 받고 있다.

mro 메서드를 호출해보자.

print(Cashier.mro())
[<class '__main__.Cashier'>, <class '__main__.Employee'>, <class 'object'>]

인스턴스에서 메서드를 호출할 때, 이 순서에 따라 파이썬이 각 클래스를 탐색해 해당 메서드가 있는지 확인을 하는 것이다.

 

이것 때문에 오버라이딩 이 가능한 것이다.

0 0