【问题标题】:`type` doesn't recognize the first argument (CPython)`type` 无法识别第一个参数(CPython)
【发布时间】:2021-08-26 14:05:25
【问题描述】:

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

【问题讨论】:

  • 建议重复与我的问题没有直接关系!
  • 我真的不明白这个问题。 __subclasscheck 通常用于检查一个对象与另一个对象。用 ine 参数调用它真的没有意义。这也是“TypeError: __subclasscheck__() 只接受一个参数(给定 0)”告诉你的。
  • “__subclasscheck__() 只接受一个参数(给定 0)”。这没有意义,因为我通过了一个论点。我现在在想......成为一个元类。 (想要表示父对象),该方法的工作方式可能与其他方法不同。无论如何,口译员的反应方式不正确。
  • 它和其他方法一样工作。 type.__subclasscheck__ 是一个未绑定的方法,因此您需要在实例上调用它,例如:object.__classcheck__(...) 或显式传递 selftype.__subclasscheck__(object, ...)
  • 如果我这样做object.__subclasscheck__(type) cython 编译正常

标签: python virtual-machine cpython


【解决方案1】:

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

例如,让我们对 intobject 类进行实验。 首先,让我们明确一点,type 是两个类的元类:

isinstance(object, type)  # True
isinstance(int, type)     # True
issubclass(object, type)  # False
issubclass(int, type)     # False

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

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__ 时,它将绑定到类X。

知道了这一点,你大概就能找出使用__subclasscheck__()的正确方法了:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2019-07-14
    • 2013-08-09
    • 2015-02-17
    相关资源
    最近更新 更多