IT

어떤 클래스가 다른 클래스의 서브 클래스인지(런타임 시) 확인하려면 어떻게 해야 합니까?

itgroup 2022. 10. 30. 21:36
반응형

어떤 클래스가 다른 클래스의 서브 클래스인지(런타임 시) 확인하려면 어떻게 해야 합니까?

예를 들어, 클래스 슈트와 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).

issubclass(class, classinfo)

발췌:

다음 경우 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

반응형