반응형
질문
파이썬에서 클래스나 메소드를 추상화하는 방법은 무엇인가요?
다음과 같이 __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>
반응형
댓글