- ABCMeta
Python에서 클래스를 정의할 때, metaclass=ABCMeta 옵션을 사용하면 해당 클래스를 추상 클래스(abstract class)로 만들 수 있다. 추상 클래스는 일반 클래스와 달리 인스턴스화 될 수 없고, 추상 메서드만을 가질 수 있다.
추상 클래스는 ABCMeta라는 내장 클래스를 사용하여 구현된다. ABCMeta는 Python 표준 라이브러리의 abc 모듈에 포함되어 있으며, 추상 클래스 및 추상 메서드를 지원하기 위한 메터 클래스이다.
from abc import ABCMeta, abstractmethod
class MyAbstractClass(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
pass
def my_concrete_method(self):
print("This is a concrete method")
# MyAbstractClass 객체를 직접 생성하려고 하면 TypeError 발생
# (MyAbstractClass는 추상 클래스이므로 인스턴스화 될 수 없음)
try:
instance = MyAbstractClass()
except TypeError as e:
print(
e
)
위 클래스를 실행하면 주석에도 써놓은 것처럼 다음과 같은 에러가 난다.
Can't instantiate abstract class MyAbstractClass with abstract method my_abstract_method
- Object Class 상속
클래스 생성시 object 를 명시적으로 상속하는 경우가 있다. (그래서 종종 클래스 정의하는 방법이 헷갈린다) 이건 다음과 같은 의미를 갖는다.
1. Python 2.x 에서는 모든 클래스가 임의로 object 클래스를 상속했다.
2. Python 3.x 에서는 object 를 쓰던 안쓰던 큰 의미는 없다. (클래스 생성시 모두 new-style-class 로 생성된다)
3. 따라서 object 클래스를 쓰는 이유는 2.x 버전에 대한 하위 호환성을 유지하기 위함이다.
참고:
python 2.x 에서 클래스를 정의할때 object 를 명시하지 않으면 old-style class, 명시하면 new-style class 라고 한다. 차이점은 다음과 같다.
- 메서드 탐색 순서: new-style class는 메서드를 찾을 때 부모 클래스를 먼저 찾는다. old-style class는 메서드를 찾을 때 자식 클래스를 먼저 찾는다.
- 기본 메서드: new-style class는 일부 특수 메서드(__init__, __call__, __getitem__ 등)를 자동으로 제공한다. old-style class는 이러한 기본 메서드를 제공하지 않는다.
- 다중 상속: new-style class는 다중 상속을 지원하지만 old-style class는 다중 상속을 지원하지 않는다.
'Development > Python' 카테고리의 다른 글
poetry 설정 및 패키지 추가 (0) | 2024.07.11 |
---|---|
파이썬 requests 의 multipart/form-data 활용 (0) | 2024.06.27 |
[Pycharm] Find in Files 검색시 venv 파일 제외 시키기 (0) | 2024.04.24 |
[FastAPI] request body의 필수값 존재 여부에 따른 응답 (0) | 2024.03.20 |
맥(Mac)에서 아나콘다(Anaconda) 제거하기 (0) | 2023.08.11 |