python--__new__与__init__区别和type与object区别

版权声明:本博客大部分文章均为原创文章,转载请标明出处哟,可以关注我个人公众号获取数据和代码~ https://blog.csdn.net/qq_27056805/article/details/86551675

首先上代码,用到的是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__函数当然还有更重要的作用,放在下一篇讲解。

猜你喜欢

转载自blog.csdn.net/qq_27056805/article/details/86551675
今日推荐