網站首頁 編程語言 正文
前言
魔術方法就是一個類/對象中的方法,和普通方法唯一的不同是:普通方法需要調用,而魔術方法是在特定時刻自動觸發
__init__
初始化魔術方法
初始化魔術方法
如何觸發:初始化對象時觸發
參數:至少一個self
返回值:無
作用:初始化對象的成員
注:使用這個方式初始化的成員都是寫入對象中的,類中不存在
class Person: def __init__(self,name): self.name = name a = Person('lisan') print(a.name)
__new__
實例化魔術方法
如何觸發:在實例化對象時觸發
參數:至少一個cls,接收當前類
返回值:必須返回一個對象實例
作用:實例化對象
注意:實例化對象是Object類底層實現,其他類繼承了Object的 __new__
才能夠實現實例化對象。沒事別碰這個魔術方法,先觸發__new__
,才會觸發__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__
調用對象的魔術方法
如何觸發:將對象當作函數調用時觸發對象()
參數:至少一個self接收對象
返回值:根據情況而定
作用:可以將復雜的步驟進行合并操作,減少調用的步驟,方便使用
注意:無
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'執行對象得到的參數{name}') a = Person() a('nbnb')
__del__
析構魔術方法
如何觸發:當對象沒有用(沒有任何變量引用)的時候觸發
參數:一個self
返回值:無
作用:使用完對象是回收資源
注意:del不一定會觸發當前方法,只有當前對象沒有任何變量接收時才會觸發
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)
通過del可以刪除某對象對地址的引用。
通過import sys``sys.getrefcount(a)
可以查看對地址的引用次數。
當代碼全部執行結束的時候,會自動執行del方法。
__str__
觸發時機:當你打印對象名的時候自動觸發,調用 __str__
里面的內容
注意:一定要加返回值,return后面的內容就是打印對象看到的內容。
class Person: def __init__(self,name): self.name = name # def __str__(self): # return self.name a = Person('lisan') print(a)
當我們直接打印對象的時候,打印出來的是一個地址,這個地址我們是看不懂的,編譯器才看得懂。
想打印對象名,要顯示出準確的東西,就需要 __str__
class Person: def __init__(self,name): self.name = name def __str__(self): return self.name a = Person('lisan') print(a)
總結
__init__和__str__
這兩個是重點。
__new__
的作用:開辟空間
__del__
的作用:沒有指針引用的時候會調用,一般是不需要重寫的
__call__
的作用:想不想讓對象當函數用。
原文鏈接:https://blog.csdn.net/weixin_73888239/article/details/128883566
相關推薦
- 2022-07-22 Android Studio Arctic Fox 的不同之處
- 2022-11-04 詳解C++?指針與二維數組名_C 語言
- 2022-06-07 FreeRTOS實時操作系統臨界段保護場合示例_操作系統
- 2022-07-04 聯邦學習FedAvg中模型聚合過程的理解分析_其它綜合
- 2022-06-14 golang連接redis庫及基本操作示例過程_Golang
- 2022-05-25 spring的構造函數注入屬性@ConstructorBinding
- 2022-03-28 C#委托方法Func()中GetInvocationList()方法的用法介紹_基礎應用
- 2022-10-25 在IIS上部署Go?API項目_win服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支