회원가입

5. [상속] 상속과 관련된 메소드와 함수들

NULL 2021-10-10

상속과 관련해서 꼭 알아두어야 할 메서드나 파이썬 함수들이 있다.

 

mro 메서드


help 함수의 실행 결과 중 Method resolution order: 라는 부분을 보았다.

이 부분에 있던 결과는 해당 인스턴스의 클래스가 어떤 부모 클래스를 가지는지 보여준다.

이 결과를 다른 방법으로도 볼 수 있다.

 

바로 모든 클래스가 갖고 있는 mro 라는 메서드를 호출하면 된다.

 

아래 코드처럼 mro 를 호출하면

class Employee:
    """직원 클래스"""
    raise_percentage = 1.03
    company_name = "코드잇 버거"

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

    def raise_pay(self):
        """직원 시급을 인상하는 메소드"""
        self.wage *= Employee.raise_percentage

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

class Cashier(Employee):
    pass

class Manager(Employee):
    pass

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

이렇게 하면 Cashier 클래스가 상속하는 부모 클래스를 볼 수 있다.

이 경우에는 object 클래스는 Cashier 클래스의 입장에서 부모 클래스부모 클래스이다.

 

isinstance 함수


isinstance 함수는 어떤 인스턴스가 주어진 클래스의 인스턴스인지를 알려준다.

 

isinstance 함수의

  1. 첫 번째 파라미터에는 검사할 인스턴스 이름
  2. 두 번째 파라미터에는 기준 클래스 이름

을 넣고 실행하면 된다.

 

이렇게 하면 그 인스턴스가 해당 클래스의 인스턴스인지를 불린 값(True, False)으로 리턴한다.

# 인스턴스를 생성한다
young = Cashier("강영훈", 8900)

print(isinstance(young, Cashier)) # 출력: True
print(isinstance(young, DeliveryMan)) # 출력: False
print(isinstance(young, Employee)) # 출력: True

young 인스턴스Cashier 클래스의 인스턴스니까 True 를 리턴했다.

하지만 DeliveryMan 클래스의 인스턴스는 아니기 때문에 False 를 리턴했다.

 

여기서 중요한 것은 마지막 줄에 isinstance(young, Employee)True 를 리턴했다는 사실이다.

Cashier 클래스는 Employee 클래스를 상속 받는 자식 클래스이다.

 

이 점이 아주아주 중요하다!!!

즉, 상속 관계에 있는 두 클래스가 있을 때, 자식 클래스로 만든 인스턴스는 부모 클래스의 인스턴스이기도 한다는 사실이다!!

 

이 점은 나중에 다형성이라는 것을 설명할 때 핵심이 되는 원리다.

 

issubclass 함수


issubclass 함수는 한 클래스가 다른 클래스의 자식 클래스인지를 알려주는 함수다.

 

  1. 첫 번째 파라미터로 검사할 클래스 이름
  2. 두 번째 파라미터로 기준이 되는 부모 클래스 이름

를 넣고 실행하면 된다.

 

print(issubclass(Cashier, Employee)) # 출력: True
print(issubclass(Cashier, object)) # 출력: True
print(issubclass(Manager, Employee)) # 출력: True
print(issubclass(Employee, list)) # 출력: False

상속 관계가 있는 경우에는 모두 True 를 리턴했다.

마지막 줄에 Employee 클래스는 list 클래스와 아무런 관련이 없으니까 False 를 리턴했다.

0 0