python - 为什么子类是对象的实例?
问题描述
据我所知,子类应该是 的子类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
>
似乎这意味着class1是class2的实例,当且仅当class2是object
,对吗?
解决方案
不是一个坏问题。
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()但请记住标准是“实时的”并且可能会在将来更新。
最后,您可以检查类对象关系。
推荐阅读
- verification - OIDC 签名验证
- java - 如何使用带有 jks 证书的 saaj 创建肥皂请求?
- ascii - 在 Julia 中,如何将 ASCII 十进制列表转换为字符串?
- c# - 如何知道 DataGridView.CellValueChanged 事件中的旧值?
- regex - 如何匹配\"而不是"
- amazon-web-services - 是否可以阻止 AWS API Gateway 创建的代理中的某些 API?
- javascript - 我怎样才能简化这个返回语句?
- node.js - Post 请求发送未定义数据 inn flutter app
- callback - Flutter - 从一个子类调用方法到另一个子类
- javascript - 数组作为 React 中的状态?