파이썬 추상클래스

딥러닝견습생·2022년 1월 5일
0

추상클래스(abstract class)

추상클래스는 메소드 구현을 강제합니다

어떤 클래스를 구현할 때, 반드시 정의해야 하는 메소드들을 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를 구현하시오

0개의 댓글