본문 바로가기

Python

추상화 클래스 (abstract class)

추상화클래스(abstract class)란? 
구현을 위한 함수 정보(=메소드)만 가진 클래스이며, 상속받는 클래스에서 구현을 강제하기 위해 사용

 

- 사용법 

> import abs (abstract base class의 약자)를 통하여 모듈을 가져오고

상속시킬 클래스 내의 추상메소드 위에 @abc.abstractmethod 를 붙인다.

 

- 구현예제

1) 부모클래스

import abc

# 부모클래스
class RandomMachine(abc.ABC):  # metaclass=abc.ABCMeta(3.4 이하)
    # 추상 메소드 (자식 클래스에서는 반드시 구현해야한다)
    @abc.abstractmethod
    def load(self, iterobj):
        """
        내용이 없는 함수
        """

    # 추상 메소드
    @abc.abstractmethod
    def pick(self, iterobj):
        """
        내용이 없는 함수
        """

	# 일반 메소드
    def inspect(self):
        items = []
        while True:
            try:
                items.append(self.pick())
            except LookupError:
                break
        return tuple(sorted(items))
        
        

2) 자식클래스

import random

class CraneMachine(RandomMachine):
    def __init__(self, items):
        self._randomizer = random.SystemRandom()
        self._items = []
        self.load(items)

    # 내용 구현 (Overriding)
    def load(self, iterobj):
    	
        self._items.extend(iterobj)  # 리스트에 리스트 추가
        self._randomizer.shuffle(self._items)
	
    # 내용 구현 (Overriding)
    def pick(self):
        try:
            return self._items.pop()
        except IndexError:
            raise LookupError('Empty Crane Box')

    def __call__(self):
        return self.pick()

 

3) 상속관계 확인

# 서브 클래스 확인
print(issubclass(RandomMachine, CraneMachine))  # False
print(issubclass(CraneMachine, RandomMachine))  # True

# 상속 구조 확인
print(CraneMachine.__mro__) # (<class '__main__.CraneMachine'>, <class '__main__.RandomMachine'>, <class 'abc.ABC'>, <class 'object'>)

 

'Python' 카테고리의 다른 글

제네레이터(Generator)란?  (0) 2020.03.26
클로저 (Closure)  (0) 2020.03.24
PEP8 이란?  (0) 2020.03.19
collections 의 모듈 namedtuple (네임드튜플)  (0) 2020.03.17
Instance(인스턴스) 메소드와 Class(클래스) 메소드  (0) 2020.03.17