每个类是如何从另一个派生出来的?
任何实现细节?
我使用isinstance(sub,base)来检查它,根据Python文档,它检查子类是否从基类派生:
isinstance(object,type) Out[1]: True isinstance(type,object) Out[2]: True
解决方法
> 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).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。