为什么子类是对象的实例?

Why a subclass is instance of object?

据我所知,子类应该是object的子类,但为什么它也是object的一个实例?

hmank ~ » python
Python 3.7.3 (default, Mar 26 2019, 21:43:19) 
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...   pass
... 
>>> isinstance(A, object)
True
>>> issubclass(A, object)
True
>>> 

此外,我引用@prosti 的回答 isinstance

Returns a Boolean stating whether the object is an instance or subclass of another object.

但同一个 link 上的示例显示

>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>

似乎意味着 class1class2 的实例,当且仅当 class2object,对吧?

在 python3 中所有 类 派生自 object 因此

class A(object):
    pass

class A:
    pass

相同。
关于为什么 isinstance(A, object) returns True
看下面的代码

class A: 
    @classmethod 
    def do(cls): 
        print(f"hello from {cls.__name__}") 

A.do()                                                                  

# hello from A

因为 python 中的所有内容都被视为对象,更好的说法是,每个对象都是 python 中对象的实例!

如果你仔细想想,它是完全有道理的,因为 python 是一种面向对象的语言,因此,每个值都是一个对象是正常的和预期的


In [9]: class A: 
   ...:     pass 
   ...:                                                                                                                                               

In [10]: isinstance(A, object)                                                                                                                        
Out[10]: True

In [11]: isinstance(A(), object)                                                                                                                      
Out[11]: True

In [12]: isinstance(1, object)                                                                                                                        
Out[12]: True

In [13]: isinstance([2,3], object)                                                                                                                    
Out[13]: True

In [14]: isinstance('hello', object)                                                                                                                  
Out[14]: True

这个问题不错。

class A:
  pass

a = A()

print(isinstance(a, A)) #True
print(isinstance(object, A)) #False
print(isinstance(A, object)) #True
print(issubclass(A, A)) #True
print(issubclass(A, object)) #True

根据定义,isinstance

Returns a Boolean stating whether the object is an instance or subclass of another object.

另一方面issubclass:

Returns a Bool type indicating whether an object is a subclass of a class.

补充说明 class 被认为是其自身的 subclass


更新:

Seems it means a class1 is an instance of class2, if and only if class2 is object, right?

通过测试得到答案,逻辑超级简单。 class 是 class 对象是 class.

的实例

如果您真的需要理解 implementation,您可以查看代码。

如果你是极客,你也可以找到 test cases

必须实例化对象才能 class在以下示例中为 True 进行验证:

class Foo: pass
class Bar(Foo): pass
print(isinstance(Bar(), Foo)) #True
print(isinstance(Bar(), Bar)) #True

print(Bar) #<class '__main__.Bar'>
print(Bar()) #<__main__.Bar object at 0x7f9fc8f32828>

此外,这里的一些例子是Python3具体的,如果你是Python2人,你必须知道你应该更明确地写:

class Bar(object): pass

如果您编写 Python 不可知的代码,(object) 部分是必须的。 最后检查 Standard on Overloading isinstance() and issubclass() 但要记住标准是 "live" 并且将来可能会更新。

最后,您可以在 classes 对象关系上检查 this