Python 3:对象是否可以是类型的实例?

Python 3:对象是否可以是类型的实例?,第1张

概述在 Python 3中,对象是一个类型实例,类型也是一个对象的实例! 每个类是如何从另一个派生出来的? 任何实现细节? 我使用isinstance(sub,base)来检查它,根据Python文档,它检查子类是否从基类派生: isinstance(object, type)Out[1]: Trueisinstance(type, object)Out[2]: True 这是Python中 在 Python 3中,对象是一个类型的实例,类型也是一个对象的实例!

每个类是如何从另一个派生出来的?

任何实现细节?

我使用isinstance(sub,base)来检查它,根据Python文档,它检查子类是否从基类派生:

isinstance(object,type)Out[1]: Trueisinstance(type,object)Out[2]: True
解决方法 这是Python中的一个优势:

> Python中的所有东西都是一个对象,所以由于object是所有的基本类型,所以键入(在Python中是某个东西)是一个对象的实例.
>由于object是所有的基本类型,对象也是一种类型,它使对象成为一个类型的实例.

请注意,这种关系是您可以用Python自己的东西复制的.这是一种内置于该语言中的异常.

在实现方面,两个名称由PyBaSEObject_Type(对象)和PyType_Type(用于类型)表示.

当您使用isinstance时,类型签入最后一步,一切都失败之后 – 由type_is_subtype_base_chain完成:

type_is_subtype_base_chain(PyTypeObject *a,PyTypeObject *b){    do {        if (a == b)            return 1;        a = a->tp_base;    } while (a != NulL);    return (b == &PyBaSEObject_Type);}

这基本上保持上升的类型层次结构,并根据b检查结果类型.如果找不到一个,那么最后的手段是检查b是否是实际的对象,在这种情况下,函数返回true:因为一切都是一个对象.所以“一切都是对象的一个​​实例”部分实际上是硬编码到实例检查中.

至于为什么对象是一种类型,这实际上更简单,因为它在declaration of PyBaseObject_Type

PyTypeObject PyBaSEObject_Type = {    PyVarObject_head_INIT(&PyType_Type,0)    "object",/* tp_name */    sizeof(PyObject),/* tp_basicsize */    …

PyVarObject_head_INIT基本上设置核心类型信息的东西,包括基类型,即PyType_Type.

这种关系实际上还有两个后果:

>由于一切都是一个对象,对象也是一个对象的实例:isinstance(object,object)>由于PyType_Type也是使用相同的PyVarObject_head_INIT实现的,所以类型也是一个类型:isinstance(type,type).

总结

以上是内存溢出为你收集整理的Python 3:对象是否可以是类型的实例?全部内容,希望文章能够帮你解决Python 3:对象是否可以是类型的实例?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1207453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存