알렉스 마르텔리는 클래스를 등록하지 않고도 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