Python 的 type 和oracle object type之间是怎么一种关系

104被浏览51,632分享邀请回答2添加评论分享收藏感谢收起6添加评论分享收藏感谢收起610被浏览21,215分享邀请回答32937 条评论分享收藏感谢收起610被浏览21,215分享邀请回答463 条评论分享收藏感谢收起610被浏览21,215分享邀请回答&&& B.__base__
&class 'A'&
在python里,所有对象(包括type)均继承自object,而object则是继承体系的根,上面再无对象:&&& object.__base__
&&& type.__base__
&class 'object'&
2、实例关系比如有class A, a = A(),不嫌烦的再强调一下,a和A都是对象,则对象a是对象A的实例,或者说对象A是对象a的类型,实例关系可通过__class__属性获知:如&&& a.__class__
&class 'A'&
在python里,对象又可以分为三种:type object、class object和non-class object,type object指type对象及其子类,如:class TypeA(type): pass
则TypeA和type均属于type objectclass object指obect对象及其子类,如:class A(object):pass
则object和A均属于class objectnon-class object指通过实例化class object得来的对象,如a = A()
则a就是一个non-class object三者的区别和联系在于:type object都是type的实例,class object是type object的实例,non-class object是class object的实例,type object和class object都可以进行实例化,而non-class object不能进行实例化在python的世界里,type object和class object这两种类型的对象都是type对象的实例而type属于type object,object属于class object,则显然:&&& object.__class__
&class 'type'&
&&& type.__class__
&class 'type'&
6添加评论分享收藏感谢收起610被浏览21,215分享邀请回答#define PyVarObject_HEAD_INIT(type, size)
1, type, size,
PyTypeObject PyType_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
/* tp_name */
sizeof(PyHeapTypeObject),
/* tp_basicsize */
sizeof(PyMemberDef),
/* tp_itemsize */
/* tp_base */
object 实际上是:PyTypeObject PyBaseObject_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
/* tp_name */
sizeof(PyObject),
/* tp_basicsize */
/* tp_itemsize */
/* tp_base */
也就是说,type 和 object 的前两个字段是一样的,都是1和 PyType_Type
ob_refcnt = 1
// 引用计数
ob_type = &PyType_Type
// 指向一个类型对象,用来指定当前对象的类型
即,type 和 object 的 ob_type 都是 PyType_Type,而PyType_Type就是 type,所以 type 的ob_type 是自己。我们来看看 isinstance() 做了什么:#define Py_TYPE(ob)
(((PyObject*)(ob))-&ob_type)
[abstract.c]
PyObject_IsInstance(PyObject *inst, PyObject *cls)
static PyObject *name = NULL;
/* Quick test for an exact match */
if (Py_TYPE(inst) == (PyTypeObject *)cls)
isinstance() 做的事情其实很简单,就是判断inst -& ob_type 指向的类型是不是 (PyTypeObject *)cls。instance(object,type) &==&
if object.ob_type == type return 1 else return 0;从前面可以看到 ob_type = &PyType_Type,而 PyType_Type 就是 type,所以,显然object 被判断为了 type 的实例。实际上他们在代码实现上并没有类与实例的关系,但是在判断的时候强加了这层关系。================实例的关系说完了,下面说说继承关系===================我们来看看 issubclass():[abstract.c]
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
return recursive_issubclass(derived, cls);
//最终转化成
[typeobject.c]
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
mro = a-&tp_
if (mro != NULL) {
if (a == b)
a = a-&tp_
} while (a != NULL);
return b == &PyBaseObject_T
//这一句!
从上面我们也可以看出 python 的继承机制。我们也可以看到,如果一个类没有基类,那他的父类就是object ,即便在代码实现上它并没有基类,但是在 issubclass()中就是这样认为的!那 type 到底有没有基类呢?目前我还没有找到 ,我会继续找的。即便有也只是给个标志位标识一下,并没有什么特殊的动作。type 和 object 在代码实现上时平行的,没有父子类的关系,但是在判断的时候,开发者将 type 判断为了 object 的子类,以满足python 对外呈现的思想。python 对外呈现的思想是:object :是一切类的基类
:一切类型都是它的实例
但实际上它的代码实现并不符合这样的思想,C 语言本身也没有类和继承的概念,开发者做了一些处理,让他们看起来是符合思想的。总结:type 和 object 其实并没有继承与实例化的关系,只是开发者为了保持 python 纯正的思想,给他们添加了联系。添加联系的方式有两种:一种是设置标志位,如ob_type,一种是函数判断中做特殊处理(就像 PyType_IsSubtype 函数那样)。最后,我没看出哪里有涉及到自举,哪位大神指点下?105 条评论分享收藏感谢收起}

我要回帖

更多关于 findobjectoftype 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信