[python] 한 클래스가 다른 클래스의 서브 클래스인지 확인하려면 (런타임에) 어떻게 확인합니까?

하트, 스페이드, 다이아몬드, 클럽이라는 클래스 슈트와 네 가지 서브 클래스가 있다고 가정 해 봅시다.

class Suit:
   ...
class Heart(Suit):
   ...
class Spade(Suit):
   ...
class Diamond(Suit):
   ...
class Club(Suit):
   ...

인스턴스가 아닌 클래스 객체 인 매개 변수로 양복을받는 메소드가 있습니다. 보다 정확하게는 하트, 스페이드, 다이아몬드, 클럽의 네 가지 값 중 하나만받을 수 있습니다. 그런 것을 보장하는 어설 션을 어떻게 만들 수 있습니까? 다음과 같은 것 :

def my_method(suit):
   assert(suit subclass of Suit)
   ...

파이썬 3을 사용하고 있습니다.



답변

당신은 사용할 수 있습니다 issubclass()이런 식으로 assert issubclass(suit, Suit).


답변

issubclass(class, classinfo)

발췌 :

class의 서브 클래스 (직접, 간접 또는 가상) 인
경우 true를 리턴합니다 classinfo.


답변

isinstance인스턴스가 있거나 issubclass클래스가있는 경우 사용할 수 있습니다 . 일반적으로 나쁜 생각이라고 생각했습니다. 일반적으로 파이썬에서는 객체가 그 일을 시도하여 무언가를 할 수 있는지 알아냅니다.


답변

issubclass(sub, sup)주어진 서브 클래스가있는 경우 부울 함수는 true를 반환 sub실제로 슈퍼 클래스의 서브 클래스입니다 sup.


답변

issubclass 최소한의 실행 가능한 예

다음은 몇 가지 주장이 포함 된보다 완전한 예입니다.

#!/usr/bin/env python3

class Base:
    pass

class Derived(Base):
    pass

base = Base()
derived = Derived()

# Basic usage.
assert issubclass(Derived, Base)
assert not issubclass(Base, Derived)

# True for same object.
assert issubclass(Base, Base)

# Cannot use object of class.
try:
    issubclass(derived, Base)
except TypeError:
    pass
else:
    assert False

# Do this instead.
assert isinstance(derived, Base)

GitHub 업스트림 .

Python 3.5.2에서 테스트되었습니다.


답변

내장 issubclass를 사용할 수 있습니다. 그러나 오리 타이핑을 사용할 수 있기 때문에 유형 검사는 일반적으로 필요하지 않은 것으로 보입니다.


답변

issubclass를 사용하는 것은 로그 레벨을 작성하는 깔끔한 방법 인 것 같습니다. 사용하는 것이 이상하다고 생각하지만 다른 옵션보다 깨끗합니다.

class Error(object): pass
class Warn(Error): pass
class Info(Warn): pass
class Debug(Info): pass

class Logger():
    LEVEL = Info

    @staticmethod
    def log(text,level):
        if issubclass(Logger.LEVEL,level):
            print(text)
    @staticmethod
    def debug(text):
        Logger.log(text,Debug)
    @staticmethod
    def info(text):
        Logger.log(text,Info)
    @staticmethod
    def warn(text):
        Logger.log(text,Warn)
    @staticmethod
    def error(text):
        Logger.log(text,Error)