Python面向?qū)ο蟮膬?nèi)置方法梳理講解
首先class類里的內(nèi)置方法,比如:__call__
,__str__
這些都是在一定條件下自動運(yùn)行的。
下面我們來介紹幾個內(nèi)置方法
1、__str__
先講講他的作用,在print打印對象的時候會自動觸發(fā)運(yùn)行
例子1:
class Student: def __init__(self,name,age): self.name = name self.age = age stu1 = Student('xiaoming',18) print(stu1) #運(yùn)行原理就是,先在Student類里找__str__方法,沒有就去他的父類找 print(object.__str__(stu1)) #驗證了Student的父類里面有__str__方法
輸出結(jié)果是
#<__main__.Student object at 0x0000023A1170C128>
#<__main__.Student object at 0x0000023A1170C128>
例子2:
我們可以在Student類自己定義一個__str__
方法來驗證,執(zhí)行print打印操作,原理#是執(zhí)行了__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__的返回值
輸入結(jié)果是:
xiaoming
<name:xiaoming age:18>
補(bǔ)充一下,對象的查找屬性的順序:對象自己的名稱空間,對象對應(yīng)類的名稱空間,該類的基類的名稱空間
2、__del__方法
作用是,會在刪除對象之前自動觸發(fā)該方法
我就直接上代碼吧
class Student: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print('%s 已經(jīng)被刪除' % self.name) stu1 = Student('xiaoming', 18) stu2 = Student('zhangsan', 18) print('主')
他的執(zhí)行結(jié)果是
主
xiaoming 已經(jīng)被刪除
zhangsan 已經(jīng)被刪除
講講為什么是這個輸出結(jié)果:這個python解釋器的垃圾回收機(jī)制吧,一個程序運(yùn)行完畢,python會回收該程序在內(nèi)存中產(chǎn)生的數(shù)據(jù),當(dāng)執(zhí)行到print(‘主’),后面沒有代碼執(zhí)行了,就會刪掉stu1,stu2這兩個對象,刪除這兩個對象之前呢,會執(zhí)行__del__
方法,所以會出現(xiàn)上面的結(jié)果。
3、__call__
在調(diào)用該對象時,也就是實例化的時候,會自動運(yùn)行其類和類的基類中的__call__
方法,如果沒有的,那么該對象是不可調(diào)用的對象
class Student: #補(bǔ)充:class Student: 相當(dāng)于就是 Student = type(類名,該類的基類們,類體代碼產(chǎn)生的名稱空間) pass Student()
分析一下:首先一切皆對象,Student就是一個對象,Student他是通過元類(type)實例化得來的,所以說調(diào)用Student(),就是去找type元類中找__call__
方法去執(zhí)行,很明顯type類中有__call__
方法,運(yùn)行上面那段代碼,不會出錯。
下面舉個例子來驗證下上面的結(jié)論
class Student: # (相當(dāng)于上面例子的type) def __init__(self, name, age): self.name = name self.age = age stu1 = Student('xiaoming', 18) # stu1(相當(dāng)于上面例子的Student) try: # 這里我們通過捕捉異常來打印出錯原因 stu1() # 這里相當(dāng)于上面Student() except Exception as e: print(e) # 打印結(jié)果是:'Student' object is not callable # “Student”對象不可調(diào)用,也就是stu1是不可調(diào)用的
結(jié)論:通過這兩個例子可以得到,只要該對象的類中有__call__
方法,那該對象就可以調(diào)用,也就是實例化。
該對象實例化,就是運(yùn)行其類中的__call__
方法
驗證下:該對象實例化,就是運(yùn)行其類中的__call__
方法
class Teacher: def __init__(self, name): self.name = name def __call__(self, *args, **kwargs): print('我被%s調(diào)用了' % self.name) tea1 = Teacher('xiaoming') tea1()
#輸出結(jié)果是:我被xiaoming調(diào)用了
如何通過元類來控制類的調(diào)用
通過在自定義元類里的__call__
方法,來實現(xiàn)對類的調(diào)用控制
1、首先類的調(diào)用原理就是運(yùn)行元類里的__call__
方法
2、通過__call__
方法來實現(xiàn)對對象的初始化操作
class Mymeta(type): def __call__(self, *args, **kwargs): # self就是Student *args和**kwargs就是Student后面的參數(shù) # print(self) # print(args) # print(kwargs) obj = self.__new__(self) # 就是創(chuàng)建一個Student的空對象 self.__init__(obj, *args, **kwargs) # 執(zhí)行__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__)
這就是類的實例化的整個過程,不過這是我們通過自定義元類來控制類的調(diào)用,也就是再__call__
多些代碼而已
在默認(rèn)元類type里,肯定有__call__
方法,該方法下面就是產(chǎn)生個空對象,再執(zhí)行__init__
方法
先講到這三個方法,其他那些__dict__,class,__name__這些就不說了
到此這篇關(guān)于Python面向?qū)ο蟮膬?nèi)置方法梳理講解的文章就介紹到這了,更多相關(guān)Python面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch 解決自定義子Module .cuda() tensor失敗的問題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請求網(wǎng)站)
這篇文章主要介紹了python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請求網(wǎng)站),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11python設(shè)置Pyplot的動態(tài)rc參數(shù)、繪圖的填充
本文主要介紹了python設(shè)置Pyplot的動態(tài)rc參數(shù)、繪圖的填充,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06python實現(xiàn)sublime3的less編譯插件示例
這篇文章主要介紹了python實現(xiàn)sublime3的less編譯插件示例的相關(guān)資料2014-04-04詳解Python的Django框架中的templates設(shè)置
這篇文章主要介紹了Python的Django框架中的TEMPLATES設(shè)置,主要講述了Django1.8版本后的一些新特性,需要的朋友可以參考下2015-05-05詳解python 條件語句和while循環(huán)的實例代碼
這篇文章主要介紹了詳解python 條件語句和while循環(huán),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值)
這篇文章主要介紹了Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07