__子条款检查呼叫订单?

2024-06-02 06:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

关于__subclasscheck__(和subclasshook__)的调用顺序,我找不到太多信息。比如说,我的子类UserString(它继承元类ABC):

class MyUserString(UserString):
    @classmethod
    def __subclasshook__(cls, C):
        print("I was called!")
        return True

print(isinstance([], UserString))

我得到了输出:

I was called!
True

用PyCharm追踪这次处决我看到了

  1. ABCMeta__instancecheck__首先被调用
  2. 然后,该控件转移到ABCMeta__subclasscheck__
  3. ^然后调用{}的__subclasshook__并返回NotImplemented
  4. ABCMeta__subclasscheck__被再次调用,但这次,它的cls参数是MyUserString,而不是(2)中的UserString
  5. MyUserString__subclasshook__最终被调用

有人能解释一下步骤2-5吗?为什么控制权从__instancecheck__转移到__subclasscheck__?为什么要调用Reversible__subclasshook__?为什么在(4)中对MyUserString调用__subclasscheck__?如果我定义了另一个子类UserString的类,比如MyUserString2,那么在(4)中,哪一个将首先用作cls,为什么


Tags: 信息true顺序子类clsabcprintwas