오리처럼 행동할 수 있는 거위

매일 공부(ML)·2023년 2월 9일
0

Fluent Python

목록 보기
80/130

객체지향 상용구

인터페이스: 프로토콜에서 ABC까지

오리처럼 행동할 수 있는 거위

알렉스 마르텔리는 클래스를 등록하지 않고도 ABC의 가상 서브클래스로 인식시킬 수 있으므로, issubclass()를 사용한 테스트를 추가한다.

class Struggle:
	def __len__(self): return 23
    
from collections import abc
isinstance(Struggle(), abc.Sized)
issubclass(Struggle, abc.Sized)

"""
issubclass() 함수는 Struggle을 abc.Sized의 서브 클래스라고 간주한다.
abc.Sized가 subclasshook()이라는 특별 클래스 메서드를 구현하기 때문이다.
"""


class Sized(metaclass=ABCMeta):
	__slots__ = ()
    
    @abstractmethod
    def __len__(self):
    	return 0
        
    @classmethod
    def __subclasshook__(cls, C):
    	if cls is Sized:
        	if any("__len__" in B.__dict__ for B in C.__mro__):
            	return True
        return NotImplemented
profile
성장을 도울 아카이빙 블로그

0개의 댓글