isinstance() and issubclass() return conflicting results

后端 未结 4 1951
既然无缘
既然无缘 2020-12-16 10:39
>>> class Hello:
    pass

and

>>> isinstance(Hello,object)
True
>>> issubclass(Hello,object)
False
>         


        
4条回答
  •  执笔经年
    2020-12-16 11:18

    My answer pertains to Python 3.

    To expand upon cbare's answer, the code below was helpful for me.

    >>> class X:
    ...     pass
    ...     
    >>> class Y(X):
    ...     pass
    ...     
    >>> x = X()
    >>> y = Y()
    >>> isinstance(x, X)  # is object x an instance of class X (or any subclass)?
    True
    >>> isinstance(x, Y)  # is object x an instance of class Y (or any subclass)?
    False
    >>> isinstance(y, X)  # is object y an instance of class X (or any subclass)?
    True
    >>> isinstance(y, Y)  # is object y an instance of class Y (or any subclass)?
    True
    
    >>> issubclass(X, X)  # is class X a subclass of X (including class X)?
    True
    >>> issubclass(X, Y)  # is class X a subclass of Y (including class Y)?
    False
    >>> issubclass(Y, X)  # is class Y a subclass of X (including class X)?
    True
    >>> issubclass(Y, Y)  # is class Y a subclass of Y (including class Y)?
    True
    
    >>> issubclass(type(x), X)  # is class of object x a subclass of X (including class X)?
    True
    >>> issubclass(type(x), Y)  # is class of object x a subclass of Y (including class Y)?
    False
    >>> issubclass(type(y), X)  # is class of object y a subclass of X (including class X)?
    True
    >>> issubclass(type(y), Y)  # is class of object y a subclass of Y (including class Y)?
    True
    
    >>> issubclass(x.__class__, X)  # is class of object x a subclass of X (including class X)?
    True
    >>> issubclass(x.__class__, Y)  # is class of object x a subclass of Y (including class Y)?
    False
    >>> issubclass(y.__class__, X)  # is class of object y a subclass of X (including class X)?
    True
    >>> issubclass(y.__class__, Y)  # is class of object y a subclass of Y (including class Y)?
    True
    

    We can see that isinstance(object, class) respects inheritance / subclasses correctly.

提交回复
热议问题