`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 int
和 object
进行实验。
首先,让我们明确一下 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
。
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
上使用 Python3type
不是常规 class。它是 python 中所有 class 的 metaclass。这意味着像 mro()
或 __subclasscheck__()
这样的 class 方法被定义为 type
元 class 上的常规方法,并且只能在实例上用作绑定方法该元class,即除type
本身之外的所有python class。
例如,让我们用 classes int
和 object
进行实验。
首先,让我们明确一下 type
是两个 classes:
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
。