상속
과 관련해서 꼭 알아두어야 할 메서드나 파이썬 함수들이 있다.
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
함수의
을 넣고 실행하면 된다.
이렇게 하면 그 인스턴스가 해당 클래스의 인스턴스인지를 불린 값(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
함수는 한 클래스가 다른 클래스의 자식 클래스인지를 알려주는 함수다.
를 넣고 실행하면 된다.
print(issubclass(Cashier, Employee)) # 출력: True
print(issubclass(Cashier, object)) # 출력: True
print(issubclass(Manager, Employee)) # 출력: True
print(issubclass(Employee, list)) # 출력: False
상속
관계가 있는 경우에는 모두 True
를 리턴했다.
마지막 줄에 Employee
클래스는 list
클래스와 아무런 관련이 없으니까 False
를 리턴했다.