본문 바로가기
Python/Python FAQ

Python 파이썬에서 추상 클래스를 만들 수 있을까요?, Is it possible to make abstract classes in Python?

by 베타코드 2023. 11. 16.
반응형

질문


파이썬에서 클래스나 메소드를 추상화하는 방법은 무엇인가요?

다음과 같이 __new__()를 재정의해 보았습니다:

class F:
    def __new__(cls):
        raise Exception("추상 클래스 %s의 인스턴스를 생성할 수 없습니다" %cls)

하지만, 이제 F를 상속받는 G 클래스를 다음과 같이 만들면:

class G(F):
    pass

G를 인스턴스화할 수 없습니다. 왜냐하면 G는 슈퍼 클래스의 __new__ 메소드를 호출하기 때문입니다.

추상 클래스를 정의하는 더 좋은 방법이 있을까요?


답변


추상 클래스를 만들기 위해 abc 모듈을 사용하세요. 메서드를 추상으로 선언하기 위해 abstractmethod 데코레이터를 사용하고, 파이썬 버전에 따라 세 가지 방법 중 하나를 사용하여 클래스를 추상으로 선언하세요.

Python 3.4 이상에서는 ABC를 상속할 수 있습니다. Python 이전 버전에서는 클래스의 메타클래스를 ABCMeta로 지정해야 합니다. 메타클래스를 지정하는 방법은 Python 3과 Python 2에서 다른 구문을 사용합니다. 다음은 세 가지 가능성입니다:

# Python 3.4+
from abc import ABC, abstractmethod
class Abstract(ABC):
    @abstractmethod
    def foo(self):
        pass
# Python 3.0+
from abc import ABCMeta, abstractmethod
class Abstract(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        pass
# Python 2
from abc import ABCMeta, abstractmethod
class Abstract:
    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        pass

어떤 방법을 사용하더라도, 추상 메서드를 가진 추상 클래스를 인스턴스화할 수는 없지만, 해당 메서드의 구체적인 정의를 제공하는 하위 클래스를 인스턴스화할 수 있습니다:

>>> Abstract()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstract with abstract methods foo
>>> class StillAbstract(Abstract):
...     pass
... 
>>> StillAbstract()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class StillAbstract with abstract methods foo
>>> class Concrete(Abstract):
...     def foo(self):
...         print('Hello, World')
... 
>>> Concrete()
<__main__.Concrete object at 0x7fc935d28898>
반응형

댓글