網站首頁 編程語言 正文
首先class類里的內置方法,比如:__call__
,__str__
這些都是在一定條件下自動運行的。
下面我們來介紹幾個內置方法
1、__str__
先講講他的作用,在print打印對象的時候會自動觸發運行
例子1:
class Student: def __init__(self,name,age): self.name = name self.age = age stu1 = Student('xiaoming',18) print(stu1) #運行原理就是,先在Student類里找__str__方法,沒有就去他的父類找 print(object.__str__(stu1)) #驗證了Student的父類里面有__str__方法
輸出結果是
#<__main__.Student object at 0x0000023A1170C128>
#<__main__.Student object at 0x0000023A1170C128>
例子2:
我們可以在Student類自己定義一個__str__
方法來驗證,執行print打印操作,原理#是執行了__str__
方法的
class Student: def __init__(self,name,age): self.name = name self.age = age def __str__(self): print(self.name) return '<name:%s age:%s>' %(self.name,self.age) stu1 = Student('xiaoming',18) print(stu1) #這個stu1就是__str__的返回值
輸入結果是:
xiaoming
<name:xiaoming age:18>
補充一下,對象的查找屬性的順序:對象自己的名稱空間,對象對應類的名稱空間,該類的基類的名稱空間
2、__del__方法
作用是,會在刪除對象之前自動觸發該方法
我就直接上代碼吧
class Student: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print('%s 已經被刪除' % self.name) stu1 = Student('xiaoming', 18) stu2 = Student('zhangsan', 18) print('主')
他的執行結果是
主
xiaoming 已經被刪除
zhangsan 已經被刪除
講講為什么是這個輸出結果:這個python解釋器的垃圾回收機制吧,一個程序運行完畢,python會回收該程序在內存中產生的數據,當執行到print(‘主’),后面沒有代碼執行了,就會刪掉stu1,stu2這兩個對象,刪除這兩個對象之前呢,會執行__del__
方法,所以會出現上面的結果。
3、__call__
在調用該對象時,也就是實例化的時候,會自動運行其類和類的基類中的__call__
方法,如果沒有的,那么該對象是不可調用的對象
class Student: #補充:class Student: 相當于就是 Student = type(類名,該類的基類們,類體代碼產生的名稱空間) pass Student()
分析一下:首先一切皆對象,Student就是一個對象,Student他是通過元類(type)實例化得來的,所以說調用Student(),就是去找type元類中找__call__
方法去執行,很明顯type類中有__call__
方法,運行上面那段代碼,不會出錯。
下面舉個例子來驗證下上面的結論
class Student: # (相當于上面例子的type) def __init__(self, name, age): self.name = name self.age = age stu1 = Student('xiaoming', 18) # stu1(相當于上面例子的Student) try: # 這里我們通過捕捉異常來打印出錯原因 stu1() # 這里相當于上面Student() except Exception as e: print(e) # 打印結果是:'Student' object is not callable # “Student”對象不可調用,也就是stu1是不可調用的
結論:通過這兩個例子可以得到,只要該對象的類中有__call__
方法,那該對象就可以調用,也就是實例化。
該對象實例化,就是運行其類中的__call__
方法
驗證下:該對象實例化,就是運行其類中的__call__
方法
class Teacher: def __init__(self, name): self.name = name def __call__(self, *args, **kwargs): print('我被%s調用了' % self.name) tea1 = Teacher('xiaoming') tea1()
#輸出結果是:我被xiaoming調用了
如何通過元類來控制類的調用
通過在自定義元類里的__call__
方法,來實現對類的調用控制
1、首先類的調用原理就是運行元類里的__call__
方法
2、通過__call__
方法來實現對對象的初始化操作
class Mymeta(type): def __call__(self, *args, **kwargs): # self就是Student *args和**kwargs就是Student后面的參數 # print(self) # print(args) # print(kwargs) obj = self.__new__(self) # 就是創建一個Student的空對象 self.__init__(obj, *args, **kwargs) # 執行__init__方法 這里需要注意查找順序 return obj # 將實例化完的對象返回回去 class Student(object, metaclass=Mymeta): def __init__(self, name, age): self.name = name self.age = age stu1 = Student('xiaoming', age=18) print(type(stu1),stu1.__dict__)
這就是類的實例化的整個過程,不過這是我們通過自定義元類來控制類的調用,也就是再__call__
多些代碼而已
在默認元類type里,肯定有__call__
方法,該方法下面就是產生個空對象,再執行__init__
方法
先講到這三個方法,其他那些__dict__,class,__name__這些就不說了
原文鏈接:https://blog.csdn.net/qdPython/article/details/127054215
相關推薦
- 2022-06-14 ASP.NET?Core?MVC控制器請求依賴注入_實用技巧
- 2022-11-02 Python?IDLE設置清屏快捷鍵的方法詳解_python
- 2022-05-28 使用Docker部署ASP.NET?Core程序_基礎應用
- 2022-09-16 Pandas索引排序?df.sort_index()的實現_python
- 2022-04-28 C++實現簡單班級成績管理系統_C 語言
- 2023-01-14 GoLang逃逸分析講解_Golang
- 2022-04-04 使用ivew開發樣式偶爾失效,布局錯亂
- 2022-12-07 C語言程序中結構體的內存對齊詳解_C 語言
- 最近更新
-
- 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同步修改后的遠程分支