본문 바로가기
Development/Python

파이썬 문법 - 클래스 정의 (ABCMeta, object)

by 폴피드 2024. 5. 30.
728x90
반응형
  • 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는 다중 상속을 지원하지 않는다.

 

 

728x90
반응형