網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
魔術(shù)方法就是一個(gè)類/對(duì)象中的方法,和普通方法唯一的不同是:普通方法需要調(diào)用,而魔術(shù)方法是在特定時(shí)刻自動(dòng)觸發(fā)
__init__
初始化魔術(shù)方法
初始化魔術(shù)方法
如何觸發(fā):初始化對(duì)象時(shí)觸發(fā)
參數(shù):至少一個(gè)self
返回值:無(wú)
作用:初始化對(duì)象的成員
注:使用這個(gè)方式初始化的成員都是寫入對(duì)象中的,類中不存在
class Person: def __init__(self,name): self.name = name a = Person('lisan') print(a.name)
__new__
實(shí)例化魔術(shù)方法
如何觸發(fā):在實(shí)例化對(duì)象時(shí)觸發(fā)
參數(shù):至少一個(gè)cls,接收當(dāng)前類
返回值:必須返回一個(gè)對(duì)象實(shí)例
作用:實(shí)例化對(duì)象
注意:實(shí)例化對(duì)象是Object類底層實(shí)現(xiàn),其他類繼承了Object的 __new__
才能夠?qū)崿F(xiàn)實(shí)例化對(duì)象。沒(méi)事別碰這個(gè)魔術(shù)方法,先觸發(fā)__new__
,才會(huì)觸發(fā)__init__
class Person: def __init__(self,name): print('------------init') self.name = name def __new__(cls,*args,**kwargs): print('----------new') return super(Person,cls).__new__(cls,*args,**kwargs) a = Person('lisan')
__call__
調(diào)用對(duì)象的魔術(shù)方法
如何觸發(fā):將對(duì)象當(dāng)作函數(shù)調(diào)用時(shí)觸發(fā)對(duì)象()
參數(shù):至少一個(gè)self接收對(duì)象
返回值:根據(jù)情況而定
作用:可以將復(fù)雜的步驟進(jìn)行合并操作,減少調(diào)用的步驟,方便使用
注意:無(wú)
class Person: def __init__(self): print('------------init') def __new__(cls ,*args ,**kwargs): print('----------new') ip = object.__new__(cls ,*args ,**kwargs) print(ip) return ip def __call__(self ,name): print('-----------call') print(f'執(zhí)行對(duì)象得到的參數(shù){name}') a = Person() a('nbnb')
__del__
析構(gòu)魔術(shù)方法
如何觸發(fā):當(dāng)對(duì)象沒(méi)有用(沒(méi)有任何變量引用)的時(shí)候觸發(fā)
參數(shù):一個(gè)self
返回值:無(wú)
作用:使用完對(duì)象是回收資源
注意:del不一定會(huì)觸發(fā)當(dāng)前方法,只有當(dāng)前對(duì)象沒(méi)有任何變量接收時(shí)才會(huì)觸發(fā)
class Person: def __init__(self,name): self.name = name def __del__(self): pass a = Person('lisi') b = a print(b.name) b.name = 'wangwu' print(a.name)
通過(guò)del可以刪除某對(duì)象對(duì)地址的引用。
通過(guò)import sys``sys.getrefcount(a)
可以查看對(duì)地址的引用次數(shù)。
當(dāng)代碼全部執(zhí)行結(jié)束的時(shí)候,會(huì)自動(dòng)執(zhí)行del方法。
__str__
觸發(fā)時(shí)機(jī):當(dāng)你打印對(duì)象名的時(shí)候自動(dòng)觸發(fā),調(diào)用 __str__
里面的內(nèi)容
注意:一定要加返回值,return后面的內(nèi)容就是打印對(duì)象看到的內(nèi)容。
class Person: def __init__(self,name): self.name = name # def __str__(self): # return self.name a = Person('lisan') print(a)
當(dāng)我們直接打印對(duì)象的時(shí)候,打印出來(lái)的是一個(gè)地址,這個(gè)地址我們是看不懂的,編譯器才看得懂。
想打印對(duì)象名,要顯示出準(zhǔn)確的東西,就需要 __str__
class Person: def __init__(self,name): self.name = name def __str__(self): return self.name a = Person('lisan') print(a)
總結(jié)
__init__和__str__
這兩個(gè)是重點(diǎn)。
__new__
的作用:開(kāi)辟空間
__del__
的作用:沒(méi)有指針引用的時(shí)候會(huì)調(diào)用,一般是不需要重寫的
__call__
的作用:想不想讓對(duì)象當(dāng)函數(shù)用。
原文鏈接:https://blog.csdn.net/weixin_73888239/article/details/128883566
相關(guān)推薦
- 2022-05-31 OpenCV角點(diǎn)檢測(cè)的實(shí)現(xiàn)示例_python
- 2021-12-06 C語(yǔ)言練習(xí)之?dāng)?shù)組中素?cái)?shù)交換_C 語(yǔ)言
- 2022-03-13 在Linux系統(tǒng)中安裝Docker的過(guò)程_docker
- 2023-07-07 maven項(xiàng)目如何引入項(xiàng)目本地jar包
- 2022-05-26 pandas進(jìn)行數(shù)據(jù)輸入和輸出的方法詳解_python
- 2021-04-07 Websocket免費(fèi)在線測(cè)試請(qǐng)求工具
- 2023-12-18 SerializationException異常產(chǎn)生原因及解決方案
- 2022-04-20 Python設(shè)計(jì)模式中的結(jié)構(gòu)型適配器模式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支