추상클래스는 메소드 구현을 강제합니다
어떤 클래스를 구현할 때, 반드시 정의해야 하는 메소드들을 Abstract Class 에 정의하여서
동일한 모델링을 강제할 수 있다.
from abc import ABCMeta, abstractmethod # abc 모듈을 임포트 해야한다
class AnimalAbstract(metaclass=ABCMeta): # metaclass 지정
@abstractmethod # 함수에 @abstractmethod 데코레이터 달아주기
def set_bark(self):
pass # 함수 내 액션은 정의하지 않음
@abstractmethod
def bark(self):
pass
class Dog(AnimalAbstract): # Dog는 Animal 추상클래스를 상속했다
pass
dog = Dog()
>>> TypeError: Can't instantiate abstract class Dog
with abstract methods bark, set_bark
# 추상클래스에서 강제한 메소드를 Dog 에서 구현하지 않았다
올바른 Dog 클래스를 정의하려면
class Dog(AnimalAbstract): # Dog는 Animal 추상클래스를 상속했다
def set_bark(self, sound):
self.sound = sound
def bark(self):
print(f"이 동물은 {self.sound} 하고 울어요")
dog = Dog()
dog.set_bark("멍멍")
dog.bark() # 이 동물은 멍멍 하고 울어요
혹은 이런방법도 가능하다
class Animal:
def set_bark(self):
raise Exception("set_bark를 구현하시오")
def bark(self):
raise Exception("bark를 구현하시오")
class Tiger(Animal):
__sound = "울음소리" # private
def set_bark(self, sound):
self.__sound = sound
def bark():
print(self.__sound)
class Cat(Animal):
pass
tiger = Tiger()
tiger.set_bark("어흥")
tiger.bark() # 어흥
# Cat 에서 필수 메소드 구현을 깜빡했다.
cat = Cat()
cat.set_bark("야옹") # Exception: set_bark를 구현하시오
cat.bark() # Exception: bark를 구현하시오