이번에는 ABCs(Abstract Base Classes)에 관해 살펴보겠습니다.
ABC는 인스턴스를 생성할 수 없고, 상속을 받아 사용되는 클래스입니다.
ABC and ABCMeta
둘 다 ABC 개념을 나타냅니다.
ABCMeta는 일반 클래스에서 사용할 수 있는 것 이상의 추가 기능을 갖춘 ABC를 정의하고 생성하는 데 사용되는 metaclass 입니다.
from abc import ABC, ABCMeta, abstractmethod
class HABC(ABC):
@abstractmethod
def test_habc(self):
pass
class HABCMeta(metaclass=ABCMeta):
@abstractmethod
def test_habcmeta(self):
pass
abc_instance = HABC() # TypeError
abcmeta_instance = HABCMeta() # TypeError
@abstractmethod
Abstract method를 나타내는 decorator 입니다.
이전에는 abstractclassmethod, abstractstaticmethod 도 사용되었지만, deprecate 되었으므로 이 decorator만 사용하시면 될 것 같아요.
from abc import ABC, abstractmethod
class HABC(ABC):
@abstractmethod
def test_habc(self):
pass
@classmethod
@abstractmethod
def test_class_habc(self):
pass
@staticmethod
@abstractmethod
def test_static_habc(self):
pass
abstractproperty도 마찬가지로 deprecate 되었습니다.
from abc import ABC, abstractmethod
class Animal(ABC):
@property
@abstractmethod
def name(self):
pass
@name.setter
@abstractmethod
def name(self, value):
pass
class Dog(Animal):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
dog = Dog("Choco")
print(dog.name) # Output: Choco
dog.name = "Happy"
print(dog.name) # Output: Happy
ABCs for Containers
collections.abc module은 class가 특정 interface를 제공하는 지를 검사할 수 있는 ABCs를 제공합니다.
이들 ABCs를 사용하면 다양한 객체에서 작동할 수 있는 보다 추상적이고 일반적인 코드를 작성할 수 있습니다.
엄청 다양한 클래스들이 제공되는 데, 몇 가지 대표적인 것들을 살펴보겠습니다.
- Container : __contains__() method가 제공되는 ABCs 입니다.
- Hashable : __hash__() method가 제공되는 ABCs 입니다.
- Sized : __len__() method가 제공되는 ABCs 입니다.
- Callable : __call__() method가 제공되는 ABCs 입니다.
- Iterable : __iter__() method가 제공되는 ABCs 입니다.
- Iterator : __iter__(), __next__() methods가 제공되는 ABCs 입니다.
이해를 돕기 위해 간단한 예제를 한 가지 살펴보겠습니다.
from collections.abc import Sequence
class MySequence(Sequence):
def __init__(self, data):
self._data = list(data)
def __getitem__(self, index):
return self._data[index]
def __len__(self):
return len(self._data)
seq = MySequence([1, 2, 3, 4, 5])
print(len(seq)) # 5
print(seq[2]) # 3
for item in seq:
print(item) # 1 2 3 4 5
Wrap Up
인터페이스를 정의하고 사용하는 데 사용되는 ABCs에 대해 살펴보았습니다.
개념만 이해하시면 어려운 내용은 없으니 잘 사용해보시길 바래요.
'Python' 카테고리의 다른 글
[PyQt6] Save and Load Settings using QSettings (0) | 2023.04.06 |
---|---|
[Python] Create and Draw Graph (0) | 2023.03.01 |
[Python] Enumeration (0) | 2023.02.21 |
[Python] Data Classes (0) | 2023.02.20 |
[Python] customtkinter 사용하기 (0) | 2023.01.17 |
댓글