`type` 无法识别第一个参数 (CPython)

`type` doesn't recognize the first argument (CPython)

CPython 无法识别以下参数:

type.__subclasscheck__(object)
# gives us: TypeError: __subclasscheck__() takes exactly one argument (0 given)

type.__subclasscheck__(object, object) # works fine
# give us: True

为什么会这样?

PS:在 Debian 10

上使用 Python3

type 不是常规 class。它是 python 中所有 class 的 metaclass。这意味着像 mro()__subclasscheck__() 这样的 class 方法被定义为 type 元 class 上的常规方法,并且只能在实例上用作绑定方法该元class,即除type本身之外的所有python class。

例如,让我们用 classes intobject 进行实验。 首先,让我们明确一下 type 是两个 classes:

的元class
isinstance(object, type)  # True
isinstance(int, type)     # True
issubclass(object, type)  # False
issubclass(int, type)     # False

但是,由于 int 继承自 object,它是 object 的子 class:

issubclass(int, object)  # True

现在,__subclasscheck__() 是什么?

type(type.__subclasscheck__)    # method_descriptor
type(object.__subclasscheck__)  # builtin_function_or_method
str(inspect.signature(type.__subclasscheck__))    # (self, subclass, /)
str(inspect.signature(object.__subclasscheck__))  # (subclass, /)

所以,__subclasscheck__()type的一个方法,也就是说当作为type.__subclasscheck__使用时是不绑定的,当作为X.__subclasscheck__使用时是绑定的到 class X.

知道了这一点,您可能会找出正确的使用方法 __subclasscheck__():

# As an unbound method:
type.__subclasscheck__(object, int)  # True
# As a bound method:
object.__subclasscheck__(int)        # True

请注意,这两种方式在逻辑上是相等的。

同样值得注意的是,如果你真的想检查一个class是否是另一个的子class,你应该只使用内置函数issubclass