首页 > 解决方案 > 为什么子类是对象的实例?

问题描述

据我所知,子类应该是 的子类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

返回一个布尔值,说明该对象是另一个对象的实例还是子类

但是同一链接上的示例显示

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

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

标签: pythoninstancesubclass

解决方案


不是一个坏问题。

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

返回一个布尔值,说明该对象是另一个对象的实例还是子类。

另一方面issubclass

返回一个 Bool 类型,指示对象是否是类的子类。

附加说明,一个类被认为是它自己的一个子类


更新:

似乎这意味着 class1 是 class2 的实例,当且仅当 class2 是对象,对吗?

你通过测试得到答案,逻辑超级简单。类是类,对象是类的实例。

如果您真的需要了解实现,您可以检查代码。

如果你是一个极客,你也可以找到测试用例。

必须实例化对象才能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)部分是必须的。最后检查重载标准 isinstance() 和 issubclass()但请记住标准是“实时的”并且可能会在将来更新。

最后,您可以检查类对象关系。


推荐阅读