为什么 __instancecheck__ 并不总是根据参数调用?

2024-05-05

有这样的代码:

class Meta(type):
  def __instancecheck__(self, instance):
    print("__instancecheck__")
    return True

class A(metaclass=Meta):
  pass


a = A()
isinstance(a, A) # __instancecheck__ not called
isinstance([], A) # __instancecheck__ called

Why __instancecheck__被要求[]争论但不是为了a争论?


PyObject_IsInstance进行精确匹配的快速测试。

Objects/abstract.c http://svn.python.org/projects/python/trunk/Objects/abstract.c:

int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
    static PyObject *name = NULL;

    /* Quick test for an exact match */
    if (Py_TYPE(inst) == (PyTypeObject *)cls)
        return 1;
// ...

不喜欢快速路径?你可以尝试这个(风险自负):

>>> import __builtin__
>>> def isinstance(a, b):
...     class tmp(type(a)):
...          pass
...     return __builtin__.isinstance(tmp(), b)
... 
>>> __builtin__.isinstance(a, A)
True
>>> isinstance(a, A)
__instancecheck__
True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 __instancecheck__ 并不总是根据参数调用? 的相关文章

随机推荐