isinstance在Python中如何为子类工作?

玩弄isinstance,我想知道它如何用于子类检查。

class A:
    pass

class B(A):
    pass

class C(B):
    pass

print(isinstance(C(), C)) # True, I understand this fine
print(isinstance(C(), B)) # True, Ok, but how is this `True`?
print(isinstance(C(), A)) # True, this too?

type() 和 isinstance() 有什么区别?解释这isinstance确实适用于我的第二个和第三个print语句中所见的子类。我的问题不是那个,但是,它是如何工作的?当 classA被定义时,它没有关于 classB或 class存在的信息C,同样B没有关于C.

根据isinstance 如何为 List 工作? __instancecheck__被调用isinstance,所以如果我的课A是之前创建BC如何做到这一点的Python知道,C()确实是子类的一个实例(B的子类A)或子类的子类AC,这是一个子类B,其本身就是一个子类A)?

当我在 Python 中继承一个类使得基类知道子类存在时会发生什么事情吗?如果是这种情况,谁能告诉我这是如何工作的?

回答

C()持有对其类型 的引用C,并C具有其C.__mro__所有祖先(包括其自身)的元组。默认type.__instancecheck__检查该元组以查看对象是否是特定类的实例。

如果您按照从 开始的函数调用type.__instancecheck__,您最终会进入这个循环:

for (i = 0; i < n; i++) {
    if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
        return 1;

在Python类也有他们的子类信息- C级PyType_Ready功能运筹学约一个子类的基类,而准备推出的子类。然而,对于第二个参数isinstance有很多后代的情况,从基类向下搜索继承图会产生病态的缓慢行为。


以上是isinstance在Python中如何为子类工作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>