본문 바로가기
Python

[Python] Abstract Base Classes

by llHoYall 2023. 2. 23.

이번에는 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

댓글