<aside> 💡 상속은 한 클래스의 속성과 메소드를 다른 클래스가 물려받게 하는 것으로, 코드의 재사용성을 늘리고 연관된 클래스들의 관계를 구축하는데 사용됩니다.
</aside>
부모 클래스
class YalcoChicken:
company_name = "얄코치킨"
next_no = 1
def __init__(self, name):
self.no = YalcoChicken.next_no
self.name = name
YalcoChicken.next_no += 1
# 매장마다 메뉴가 바뀔 수 있으므로 인스턴스 속성으로
self.chicken_menus = {
"양념": {"price": 12_000, "spicy": True},
"후라이드": {"price": 10_000, "spicy": False}
}
def order_chicken(self, chicken_name):
chicken_menu = self.chicken_menus.get(chicken_name)
if chicken_menu:
return f"{chicken_name}은(는) {chicken_menu['price']}원입니다."
else:
return "그런 치킨은 없습니다."
def intro(self):
return f"안녕하세요, {YalcoChicken.company_name} {self.no}호 {self.name}점입니다!"
store_1 = YalcoChicken("강남")
store_1_order_1 = store_1.order_chicken("양념")
store_1_order_2 = store_1.order_chicken("간장")
pass
자식 클래스
class YalcoChickenPub(YalcoChicken):
sub_comp_name = "얄코치킨 & 펍"
def __init__(self, name):
# super() : 부모 클래스를 가리킴
# 부모 클래스의 생성자 먼저 실행
super().__init__(name)
self.drink_menus = {
"맥주": {"price": 3000},
"소주": {"price": 2000},
}
def order(self, chicken_name, drink_name):
# 부모 클래스의 메소드 실행
result = super().order_chicken(chicken_name)
drink_menu = self.drink_menus.get(drink_name)
if drink_menu:
result += f"{drink_name}은(는) {drink_menu['price']}원입니다."
else:
result += " 그런 음료는 없습니다."
return result
# 부모의 메소드 오버라이드
def intro(self):
return f"안녕하세요, {YalcoChickenPub.sub_comp_name} {self.no}호 {self.name}점입니다!"
super()
: 부모 클래스에 접근# next_no(클래스 변수)는 부모와 같은 값 사용 확인
store_2 = YalcoChickenPub("신촌")
store_3 = YalcoChickenPub("명동")
# 자식 클래스의 인스턴스는 부모 클래스에 속함
is_inst_1 = isinstance(store_2, YalcoChickenPub)
is_inst_2 = isinstance(store_2, YalcoChicken)
# 반대는 성립하지 않음
is_inst_3 = isinstance(store_1, YalcoChickenPub)
store_2_order_1 = store_2.order("양념", "맥주")
# 자식 클래스는 부모의 메소드 호출 가능 (반대는 성립 X)
store_2_order_2 = store_2.order_chicken("후라이드")
# 오버라이드 override : 부모의 메소드를 덮어쓰기
store_2_intro = store_2.intro()
💧 슬라임과 화염슬라임 예제