python3 type和object的关系

学习python的同学都知道这么几句话:
1. object类是所有新式类的父类
2. type是所有类的类

那么type和object是什么关系呢?
object是一个新式类,我们可以通过object.class和object.bases来获取object所属的类和他的父类。

首先比较object和type:

print('object', object.__class__, object.__bases__)
print('type', type.__class__, type.__bases__)


object <class 'type'> ()
type <class 'type'> (<class 'object'>,)
  1. object和type都属于 type类 class ‘type’。
  2. object的父类为空,说明它没有继承任何类。
  3. type的父类为 object类 class ‘object’。

然后比较list, dict和tuple:

print('list', list.__class__, list.__bases__)
print('dict', dict.__class__, dict.__bases__)
print('tuple', tuple.__class__, tuple.__bases__)


list <class 'type'> (<class 'object'>,)
dict <class 'type'> (<class 'object'>,)
tuple <class 'type'> (<class 'object'>,)
  1. list, dict和tuple都属于type类 class ‘type’
  2. 父类都是object类 class ‘object’

比较一个实例化的list:

a = [1, 2]
print(a.__class__)
print(a.__bases__)


<class 'list'>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-149-3008ef49a253> in <module>()
      1 a = [1, 2]
      2 print(a.__class__)
----> 3 print(a.__bases__)

AttributeError: 'list' object has no attribute '__bases__'
  1. 实例化的list它的类型是
class MyClass:
    pass

print('MyClass', MyClass.__class__, MyClass.__bases__)
print('*'*50)
print('MyClass Obj', MyClass().__class__)
print('MyClass Obj', MyClass().__bases__)


MyClass <class 'type'> (<class 'object'>,)
**************************************************
MyClass Obj <class '__main__.MyClass'>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-155-1ed1608465fe> in <module>()
      4 print('*'*50)
      5 print('MyClass Obj', MyClass().__class__)
----> 6 print('MyClass Obj', MyClass().__bases__)

AttributeError: 'MyClass' object has no attribute '__bases__'
  1. 自定义类本身属于type类 class ‘type’ ,并且父类是object类 class ‘object’
  2. 自定义类的实例化的对象属于类本身,并且对象不存在父类属性

比较自定义元类:

class MyMetaClass(type):
    pass
print('MyMetaClass', MyMetaClass.__class__, MyMetaClass.__bases__)


MyMetaClass <class 'type'> (<class 'type'>,)
  1. 元类本身属于type类 class ‘type’ ,并且父类也是type类 class ‘type’。

总结一下:
type元类的类则是由type元类自身创建的。object类是由元类type创建的,但是type类又继承了object类。

图示:虚线表示源是目标的实例,实线表示源是目标的子类
这里写图片描述

猜你喜欢

转载自blog.csdn.net/andybegin/article/details/80775773
今日推荐