假设我有一个类Suit和四个子类Suit:红心、黑桃、方块、梅花。

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

我有一个方法,它接收suit作为参数,这是一个类对象,而不是一个实例。更准确地说,它可能只接受四个值中的一个:红心,黑桃,方块,梅花。我怎么能做出保证这样的断言呢?喜欢的东西:

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

我用的是Python 3。


当前回答

#issubclass(child,parent)

class a:
    pass
class b(a):
    pass
class c(b):
    pass

print(issubclass(c,b))#it returns true

其他回答

如果给定的子类sub确实是父类sup的子类,则issubclass(sub, sup)布尔函数返回true。

#issubclass(child,parent)

class a:
    pass
class b(a):
    pass
class c(b):
    pass

print(issubclass(c,b))#it returns true

你可以像这样使用issubclass()断言issubclass(suit, suit)。

issubclass (classinfo类)

摘录:

的子类(直接的、间接的或虚的),则返回true classinfo。

使用is子类似乎是一种编写日志级别的干净方法。用它感觉有点奇怪……但它似乎比其他选择更干净。

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)