에듀테크 프로젝트 대시보드
상속 · 다형성
하위 클래스는 상위의 속성·메서드를 물려받고 super() 로 상위 구현을 호출합니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError
class Dog(Animal):
def speak(self): # 오버라이딩
return f"{self.name}: 멍"
class Cat(Animal):
def speak(self):
return f"{self.name}: 야옹"
for a in [Dog("바둑"), Cat("나비")]:
print(a.speak()) # 다형성 — 같은 호출, 다른 동작class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
class Manager(Employee):
def __init__(self, name, salary, team):
super().__init__(name, salary) # 상위 __init__ 재사용
self.team = team
def describe(self):
base = super().describe() if hasattr(super(), "describe") else ""
return f"{self.name}, 팀 {len(self.team)}명"d = Dog("바둑")
isinstance(d, Dog) # => True
isinstance(d, Animal) # => True (상위도 True)
isinstance(d, (Cat, Dog)) # => True (튜플 중 하나)
issubclass(Dog, Animal) # => True
type(d) is Dog # 정확히 그 타입인지 (상속 무시)
# 타입 검사보다 덕 타이핑 선호: hasattr(x, "speak")class A:
def go(self): print("A")
class B(A):
def go(self): print("B"); super().go()
class C(A):
def go(self): print("C"); super().go()
class D(B, C):
def go(self): print("D"); super().go()
D().go() # D → B → C → A (super 체인)
D.__mro__ # 메서드 탐색 순서 (C3 선형화)
# 믹스인 패턴
class JsonMixin:
def to_json(self): import json; return json.dumps(self.__dict__)from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self) -> float: ...
def describe(self): # 구체 메서드도 가능
return f"넓이 {self.area()}"
# s = Shape() # TypeError — 추상 클래스는 인스턴스화 불가
class Square(Shape):
def __init__(self, side): self.side = side
def area(self): return self.side ** 2 # 반드시 구현해야Dog is an Animal)