어떤 클래스가 다른 클래스의 서브 클래스인지(런타임 시) 확인하려면 어떻게 해야 합니까?
예를 들어, 클래스 슈트와 4개의 서브 클래스 슈트가 있다고 합시다.하트, 스페이드, 다이아몬드, 클럽
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
suit를 파라미터로 수신하는 메서드가 있는데, 이것은 인스턴스가 아닌 클래스 오브젝트입니다.보다 정확하게는, 다음의 4개의 값 중 1개만을 수신할 수 있습니다.하트, 스페이드, 다이아몬드, 클럽어떻게 하면 그런 것을 확실히 할 수 있는 주장을 할 수 있을까요?예를 들어 다음과 같습니다.
def my_method(suit):
assert(suit subclass of Suit)
...
Python 3를 쓰고 있어요.
사용할 수 있습니다.issubclass()
이것처럼.assert issubclass(suit, Suit)
.
발췌:
다음 경우 true를 반환한다.
class
의 서브 클래스(직접, 간접 또는 가상)입니다.classinfo
.
사용할 수 있습니다.isinstance
인스턴스가 있는 경우 또는issubclass
수업이 있다면.평소엔 안 좋은 생각인 줄 알았는데보통 Python에서는 어떤 오브젝트가 무언가를 할 수 있는지 그 오브젝트에 대해 그것을 시도함으로써 해결합니다.
그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에서 테스트 완료.
Python 문서에 따르면, 우리는 또한class.__mro__
속성 또는class.mro()
방법:
class Suit:
pass
class Heart(Suit):
pass
class Spade(Suit):
pass
class Diamond(Suit):
pass
class Club(Suit):
pass
>>> Heart.mro()
[<class '__main__.Heart'>, <class '__main__.Suit'>, <class 'object'>]
>>> Heart.__mro__
(<class '__main__.Heart'>, <class '__main__.Suit'>, <class 'object'>)
Suit in Heart.mro() # True
object in Heart.__mro__ # True
Spade in Heart.mro() # False
내장된 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)
#issubclass(child,parent)
class a:
pass
class b(a):
pass
class c(b):
pass
print(issubclass(c,b))#it returns true
언급URL : https://stackoverflow.com/questions/4912972/how-do-i-check-at-runtime-if-one-class-is-a-subclass-of-another
'IT' 카테고리의 다른 글
필드 이름 주위에 백틱 사용 (0) | 2022.11.07 |
---|---|
Axios에서 헤더와 옵션을 설정하려면 어떻게 해야 합니다. (0) | 2022.11.07 |
Java 콜 스택의 최대 깊이는 얼마입니까? (0) | 2022.10.30 |
PHP cURL HTTP PUT (0) | 2022.10.30 |
다른 테이블에 존재하지 않음으로써 SQL의 특정 행 표시 (0) | 2022.10.30 |