Python中__new__方法有什么用


这篇文章主要为大家展示了“Python中__new__方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中__new__方法有什么用”这篇文章吧。接下来通过实例逐步详细阐述__ new __ 方法在类初始化过程中是什么样的存在!注:1、代码实例化类过程一般使用__init__()方法初始化一个类的实例,当代码中实例化一个类的时候,第一个调用执行的是__new__()方法,当定义的类中没有重新定义__new__()方法时候,Python会默认调用该父类的__new__()方法来构造该实例,new方法就是先创建一个空间,然后每次创建一个实例化的对象,然后用开辟的空间存放这个实例化对象; 再次创建一个实例化的对象的时候,再用new方法开辟一个空间存放实例化对象。注意只有继承了object的类才有此方法。2、内存地址和对象可相互转换print(id(a))与 print(id(b))打印出来的都是内存地址(10进制),print(a)与print(b)返回了类的名称和对象的地址,但是两者并不相同。每次实例化类都会创建分配不同的对象地址,因此,代码实免费云主机域名例化类过程中返回类对象的地址引用也就不同。注:1、__init__()方法和__new__()方法区别__new__()方法用于创建实例,类实例化之前会首先调用,它是class的方法,是个静态方法。而__init__()方法用户初始化实例,该方法用在实例对象创建后被调用,它是实例对象的方法,用于设置类实例对象的一些初始值。如果类中同时出现了__init__()方法和__new__()方法,则先调用__new__()方法后调用__init__()方法。__new__()方法是创建实例的第一步,执行完了需要返回创建的类的实例,否则则报错,无法执行__init__()方法。其中,__init__()方法将不返回任何信息。2、重写__new__()方法super()与object.__new__(cls)都是在调用父类的new方法,必须把父类的new方法返回给函数,才能开辟空间,因此必须添加return。代码的执行顺序是:先执行new方法,然后执行init方法,最后是其它方法。单例模式最初的定义出现于《设计模式》:“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”单例的使用主要是在需要保证全局只有一个实例可以被访问的情况,比如系统日志的输出、操作系统的任务管理器等。输出初始化initA1110
解析完成finishA11
初始化initA1210
解析完成finishA12
2465140199816
2465140199816
A12
A12注:1、单例模式始终只有一个空间,该空间一直重复利用。首先定义一个类的私有属性_instance,用来记录第一个被创建对象的引用,如果cls._instance为None说明该类还没有实例化过,则实例化该类并返回实例对象。通过以下数据测试可知,print(obj.name, obj.data)最后打印出来的都是A12,第一次打印”A11″时,属性为空,执行if语句开辟了一个空间存放该属性;从 第二次打已经开辟了空间 ,执行else语句,直接返回”A12″到原来的空间中,把前面的盖数据覆盖掉。输出<__main__.solution>
初始化initA1110
A1110
初始化initA1220
A1220
初始化initA1330
A1330
初始化initA1440
A1440
初始化initA1220
A12202、单例模式另外一种实现方法以上实现了单例模式对象空间的重复利用,但是有时候我们想初始化过程只加载一次,避免频繁请求浪费系统资源(如数据库连接请求数据)。输出初始化initA1110
解析完成finishA11
解析完成finishA12
2280855720328
2280855720328
A12
A12注:1、单例模式下仅加载一次初始化过程。这时候我们在类空间中再添加一个init_flag属性来记录是否已经执行过初始化操作即可实现加载一次初始化过程。从以上两次实例化过程结果来看,对象引用地址不变,结果被最后一次实例化数据覆盖且初始化init只被打印一次。2、单例模式下一次资源加载注意点单例模式下控制类仅进行一次初始化过程适用于资源一次性加载进缓存的过程,对于多进程应用可采用多例模式实现。多个实例对象空间引用地址完全独立,从而保持避免不同请求资源不被占用。将同一个对象请求归为同一个实例。注:1、多例模式始终具有多个空间,不同空间完全独立。我们在类空间中定义类实例化对象字典,即建立不同的实例对象和对象空间地址引用键值对,从而实现多例模式。通过类字典判断实例对象是否创建,节省创建的成本。2、多例模式测试过程当创建相同的实例对象name=”A11″时,程序首先在实例池中搜索cls._loaded.get(name),若存在则直接返回已创建的实例对象空间。多例模式完美的实现了不同访问对象具体不同的实例化对象地址。3、多例模式下缓冲机制的实现进一步优化多例模式初始化过程,比如读取文件或者数据库时仅进行一次初始化加载。输出正在创建访问对象A11
<__main__.solution>
初始化initA1110
解析完成finishA11
已经存在访问对象A11
<__main__.solution>
解析完成finishA11
正在创建访问对象A12
<__main__.solution>
初始化initA1220
解析完成finishA12
True
A11
A11
A12注:多例模式下多个实例化对象均只进行一次初始化过程。重写__new__方法中每个实例对象创建后绑定初始化_init_db()方法执行一次,后面遇到同一个实例对象将不会发生什么,直接返回已创建的实例对象。从测试结果来看,创建相同的实例对象name=”A11″时,第二次将略过初始化数据加载过程,很好的实现了缓存机制。以上是“Python中__new__方法有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注百云主机行业资讯频道!

相关推荐: Java中StringRedisTemplate和RedisTemplate怎么使用

这篇文章主要介绍“Java中StringRedisTemplate和RedisTemplate怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中StringRedisTemplate和RedisTempl…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/31 22:28
下一篇 07/31 22:28

相关推荐