假设我有一个类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()断言issubclass(suit, suit)。

其他回答

#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。

is子类最小可运行示例

下面是一个包含一些断言的更完整的例子:

#!/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中测试。

issubclass (classinfo类)

摘录:

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

根据Python文档,我们也可以使用类。__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