Как проверить (во время выполнения), является ли один класс подклассом другого?


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

у меня есть метод, который получает костюм в качестве параметра, который является объектом класса, а не экземпляра. Точнее, он может получить только одно из четырех значений: сердце, лопата, бриллиант, дубинка. Как я могу сделать утверждение, которое гарантирует такую вещь? Что-то вроде:

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

Я использую Python 3.

7 131

7 ответов:

можно использовать issubclass() такой assert issubclass(suit, Suit).

но почему вы хотите сделать такую вещь? Python-это не Java.

issubclass(class, classinfo)

выдержка:

возвращает true, если class является подклассом (прямым, косвенным или виртуальным) classinfo.

можно использовать isinstance Если у вас есть экземпляр, или issubclass если у вас есть класс. Обычно думал, что это плохая идея. Обычно в Python вы работаете, если объект способен на что-то, пытаясь сделать это с ним.

The issubclass(sub, sup) булева функция возвращает true, если данный подкласс sub действительно подкласс суперкласса sup.

вы можете использовать встроенный 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