电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python函數__new__及__init__作用及區別解析

瀏覽:78日期:2022-07-12 17:40:09

【同】

二者均是Python面向對象語言中的函數,__new__比較少用,__init__則用的比較多。

【異】

__new__是在實例創建之前被調用的,因為它的任務就是創建實例然后返回該實例對象,是個靜態方法。__init__是當實例對象創建完成后被調用的,然后設置對象屬性的一些初始值,通常用在初始化一個類實例的時候。是一個實例方法。

也就是:__new__先被調用,__init__后被調用,__new__的返回值(實例)將傳遞給__init__方法的第一個參數,然后__init__給這個實例設置一些參數。

Python函數__new__及__init__作用及區別解析

===》》》Python函數__new__及__init__作用及區別解析

【一些說明】

1、繼承自object的新式類才有__new__

2、__new__至少要有一個參數cls,代表當前類,此參數在實例化時由Python解釋器自動識別

3、__new__必須要有返回值,返回實例化出來的實例,這點在自己實現__new__時要特別注意,可以return父類(通過super(當前類名, cls))__new__出來的實例,或者直接是object的__new__出來的實例

4、__init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值

5、如果__new__創建的是當前類的實例,會自動調用__init__函數,通過return語句里面調用的__new__函數的第一個參數是 cls 來保證是當前類實例,如果是其他類的類名,;那么實際創建返回的就是其他類的實例,其實就不會調用當前類的__init__函數,也不會調用其他類的__init__函數。

6、在定義子類時沒有重新定義__new__()時,Python默認是調用該類的直接父類的__new__()方法來構造該類的實例,如果該類的父類也沒有重寫__new__(),那么將一直按此規矩追溯至object的__new__()方法,因為object是所有新式類的基類。

7、而如果子類中重寫了__new__()方法,那么你可以自由選擇任意一個的其他的新式類(必定要是新式類,只有新式類必定都有__new__(),因為所有新式類都是object的后代,而經典類則沒有__new__()方法)的__new__()方法來制造實例,包括這個新式類的所有前代類和后代類,只要它們不會造成遞歸死循環。反正肯定不能調用自己的__new__,這肯定是死循環。

8、對于子類的__init__,其調用規則跟__new__是一致的,當然如果子類和父類的__init__函數都想調用,可以在子類的__init__函數中加入對父類__init__函數的調用。

9、我們在使用時,盡量使用__init__函數,不要去自定義__new__函數,因為這兩者在繼承派生時的特性還是很不一樣的。

10、將類比作制造商,__new__方法就是前期的原材料購買環節,__init__方法就是在有原材料的基礎上,加工,初始化商品環節

【__init__方法】

Python函數__new__及__init__作用及區別解析

【__new__方法】

__new__方法接受的參數雖然也是和__init__一樣,但__init__是在類實例創建之后調用,而 __new__方法正是創建這個類實例的方法。

Python函數__new__及__init__作用及區別解析 ===》Python函數__new__及__init__作用及區別解析

具體的執行邏輯:

1. p = Person(name, age)

2. 首先執行使用name和age參數來執行Person類的__new__方法,這個__new__方法會返回Person類的一個實例(通常情況下是使用 super(Persion, cls).__new__(cls, ... ...) 這樣的方式),

3. 然后利用這個實例來調用類的__init__方法,上一步里面__new__產生的實例也就是 __init__里面的的 self。

所以,__init__ 和 __new__ 最主要的區別在于:

1.__init__ 通常用于初始化一個新實例,控制這個初始化的過程,比如添加一些屬性, 做一些額外的操作,發生在類實例被創建完以后。它是實例級別的方法。

2.__new__ 通常用于控制生成一個新實例的過程。它是類級別的方法。

【__new__的作用】

依照Python官方文檔的說法,__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現自定義的metaclass。

首先我們來看一下第一個功能,具體我們可以用int來作為一個例子:

假如我們需要一個永遠都是正數的整數類型,通過集成 int,我們可能會寫出這樣的代碼。

Python函數__new__及__init__作用及區別解析

但運行后會發現,結果根本不是我們想的那樣,我們任然得到了-3。這是因為對于int這種 不可變的對象,我們只有重載它的__new__方法才能起到自定義的作用。

這是修改后的代碼:

Python函數__new__及__init__作用及區別解析

通過重載__new__方法,我們實現了需要的功能。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 南京泽朗生物科技有限公司| 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 中宏网-今日新闻-财经新闻| 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 江门流水线|江门工作台|江门市伟涛行工业设备有限公司 | 九爱图纸|机械CAD图纸下载交流中心 | 恒温油槽-恒温水槽-低温恒温槽厂家-宁波科麦仪器有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 精准猎取科技资讯,高效阅读科技新闻_科技猎| LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 | 东莞海恒试验仪器设备有限公司 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 陕西自考报名_陕西自学考试网 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 |