하트, 스페이드, 다이아몬드, 클럽이라는 클래스 슈트와 네 가지 서브 클래스가 있다고 가정 해 봅시다.
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)
.
답변
답변
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)
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)
