추상 클래스
- 추상클래스가 하나 이상 포함된 클래스
- 객체지향프로그래밍에서 다형성을 부여하는 중요한 문법이다.
추상 메서드
- 구현이 없이 선언만 되어 있는 메서드(pass or ...)
- 추상 메서드는 자식 클래스에서 반드시 구현(추상 클래스가 추상클래스를 상속한다면 반드시 구현할 필요는 없다)
- 추상 메서드를 사용하여 공통된 메서드를 강제할 수 있다.
abc
- Abstract Base Class로서 추상화를 도와주는 파이썬의 모듈이다.
abc의 성질
* ABC를 상속받은 클래스에 abstractmethod에 의한 추상 메서드가 하나 이상 있다면 이는 추상 클래스가 되고 인스턴스화가 불가능해진다.
from abc import ABC, abstractmethod
class standable(ABC):
@abstractmethod
def stand(self):
pass
stand = standable()
TypeError: Can't instantiate abstract class standable with abstract method stand
* 추상클래스를 상속받은 클래스는 반드시 추상메서드를 구현해야 한다.
from abc import ABC, abstractmethod
class standable(ABC):
@abstractmethod
def stand(self):
pass
class Person(standable):
def sit(self):
print("sit")
person = Person()
TypeError: Can't instantiate abstract class Person with abstract method stand
* ABC모듈은 runtime 단계에서 에러를 raise할 수 있지만 컴파일 단계(mypy 또는 pyright를 통한 typecheck 단계)에서도 가능하다.
mypy ABC.py
ABC.py:15: error: Cannot instantiate abstract class "Person" with abstract attribute "stand" [abstract]
Found 1 error in 1 file (checked 1 source file)
* 추상 클래스는 추상클래스를 상속할 수 있다.
from abc import ABC, abstractmethod
class standable(ABC):
@abstractmethod
def stand(self):
pass
class initiatable(standable):
def __init__(self, name: str):
self.name = name
class Person(initiatable):
def stand(self):
print("stand")
def my_name(self):
print("im " + self.name)
person = Person("steve")
person.stand()
person.my_name()
stand
im steve
* 컴파일 단계에서 추상클래스의 자료형으로 type check를 할 수 있다.
from abc import ABC, abstractmethod
class standable(ABC):
@abstractmethod
def stand(self):
pass
class Person(standable):
def stand(self):
print("stand")
def sit(self):
print("sit")
def run(self):
print("run")
person: standable = Person()
person.sit()
ABC.py:22: error: "standable" has no attribute "sit"