首先上代码,用到的是python3,不适合python2:
class B():
def __new__(cls):
print("6:B.__new__")
print("7-1:",object.__new__(cls)," 7-2:",cls)
return object.__new__(cls)
def __init__(self):
print("8-1:B.__init__"," 8-2:",self)
b=B()
print('1:',B.__class__)
print('2:',type(B))
print('3:',b.__class__)
print('4:',b.__class__.__class__)
print('5:',B.__bases__)
#object与type之间的关系
print('9:',object.__bases__)#object的父类
print('10:',object.__class__)#object的类型
print('11:',object)#object的本质
print('12:',type.__class__)#type的类型
print("13:",type.__bases__)#type的父类
print("14:",type)#type的本质
下面是打印结果:
6:B.__new__
7-1: <__main__.B object at 0x000002F0864E5F60> 7-2: <class '__main__.B'>
8-1:B.__init__ 8-2: <__main__.B object at 0x000002F0864E5F60>
1: <class 'type'>
2: <class 'type'>
3: <class '__main__.B'>
4: <class 'type'>
5: (<class 'object'>,)
9: ()
10: <class 'type'>
11: <class 'object'>
12: <class 'type'>
13: (<class 'object'>,)
14: <class 'type'>
__init__与__new__之间的关系
6和8-1的打印顺序可知,在创建一个类实例时,首先调用__new__函数,然后调用__init__函数。
7-1是__new__函数返回的对象,我们查看它为类B的实例(因为打印出了内存地址,说明已经是实例了),这说明__new__函数是用来创建实例的。
7-2打印cls参数,该参数为类B(并不是实例)。
8-2打印self本身,发现它是类B的实例,且和object.new(cls)是同一个实例(因为内存地址一样),这就说明:__new__函数创建好的实例传递给了__init__函数的self参数。而__init__的工作是初始化类的实例。
二者的分工就相当于__new__负责根据图纸建房子,而__init__则负责房子的装修,添置家具等工作。
object与type之间的关系
1和2说明type()和__class__属性是一致的,都是反映类的类型,即类B的类型是type;
3说明实例b的类型为B,即对于实例而言,谁实例化它,它的类型就是谁;
4中由于b.__class__就是B,所以b.class.__class__也是B.class,即type;
5则说明我们没有显示让B继承至object,但B的父类却是object。这说明,在python3中object是所有类默认的父类.
9则说明object没有父类,在继承这一块,object是鼻祖,一切继承的起点就是object.
10则说明object是type类型
11则说明object是一个类,考虑到9、10,我们综合一下:object是一个类型为type的类,是所有类的鼻祖父类,它本身没有父类。
12则说明type的类型是type本身。
13则说明type的父类是object;
14则说明type是一个类,考虑到12、13,我们综合一下:type是一个类型为它本身的类,是所有类型的鼻祖,它的父类是object.
总结:
1.type和object是python世界里的两个鼻祖,object是继承关系中的鼻祖起源,负责类的继承这一块工作;type是类型范畴关系的鼻祖起源,负责类型定位这一块工作。
2.假设生物的起源是细胞,生物的类型是生命。那么object就相当于这个细胞,是继承繁衍的起源,而type相当于生命,是所有生物的类型定位。这两个对象无法分开,你中有我,我中有你。只要你知道它们具体负责不同的工作即可。
3.__new__用来创建类实例(并不会初始化),__init__用来初始化实例(并不会创建实例)。二者分工明确,相互衔接,实现类实例的生成(创建与初始化)。
4.__new__函数当然还有更重要的作用,放在下一篇讲解。