Python面向?qū)ο蟮膬?nèi)置方法梳理講解
首先class類里的內(nèi)置方法,比如:__call__,__str__這些都是在一定條件下自動(dòng)運(yùn)行的。
下面我們來介紹幾個(gè)內(nèi)置方法
1、__str__
先講講他的作用,在print打印對(duì)象的時(shí)候會(huì)自動(dòng)觸發(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)) #驗(yàn)證了Student的父類里面有__str__方法
輸出結(jié)果是
#<__main__.Student object at 0x0000023A1170C128>
#<__main__.Student object at 0x0000023A1170C128>
例子2:
我們可以在Student類自己定義一個(gè)__str__方法來驗(yàn)證,執(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) #這個(gè)stu1就是__str__的返回值輸入結(jié)果是:
xiaoming
<name:xiaoming age:18>
補(bǔ)充一下,對(duì)象的查找屬性的順序:對(duì)象自己的名稱空間,對(duì)象對(duì)應(yīng)類的名稱空間,該類的基類的名稱空間
2、__del__方法
作用是,會(huì)在刪除對(duì)象之前自動(dòng)觸發(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)被刪除
講講為什么是這個(gè)輸出結(jié)果:這個(gè)python解釋器的垃圾回收機(jī)制吧,一個(gè)程序運(yùn)行完畢,python會(huì)回收該程序在內(nèi)存中產(chǎn)生的數(shù)據(jù),當(dāng)執(zhí)行到print(‘主’),后面沒有代碼執(zhí)行了,就會(huì)刪掉stu1,stu2這兩個(gè)對(duì)象,刪除這兩個(gè)對(duì)象之前呢,會(huì)執(zhí)行__del__方法,所以會(huì)出現(xiàn)上面的結(jié)果。
3、__call__
在調(diào)用該對(duì)象時(shí),也就是實(shí)例化的時(shí)候,會(huì)自動(dòng)運(yùn)行其類和類的基類中的__call__方法,如果沒有的,那么該對(duì)象是不可調(diào)用的對(duì)象
class Student: #補(bǔ)充:class Student: 相當(dāng)于就是 Student = type(類名,該類的基類們,類體代碼產(chǎn)生的名稱空間)
pass
Student()分析一下:首先一切皆對(duì)象,Student就是一個(gè)對(duì)象,Student他是通過元類(type)實(shí)例化得來的,所以說調(diào)用Student(),就是去找type元類中找__call__方法去執(zhí)行,很明顯type類中有__call__方法,運(yùn)行上面那段代碼,不會(huì)出錯(cuò)。
下面舉個(gè)例子來驗(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: # 這里我們通過捕捉異常來打印出錯(cuò)原因
stu1() # 這里相當(dāng)于上面Student()
except Exception as e:
print(e)
# 打印結(jié)果是:'Student' object is not callable
# “Student”對(duì)象不可調(diào)用,也就是stu1是不可調(diào)用的結(jié)論:通過這兩個(gè)例子可以得到,只要該對(duì)象的類中有__call__方法,那該對(duì)象就可以調(diào)用,也就是實(shí)例化。
該對(duì)象實(shí)例化,就是運(yùn)行其類中的__call__方法
驗(yàn)證下:該對(duì)象實(shí)例化,就是運(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__方法,來實(shí)現(xiàn)對(duì)類的調(diào)用控制
1、首先類的調(diào)用原理就是運(yùn)行元類里的__call__方法
2、通過__call__方法來實(shí)現(xiàn)對(duì)對(duì)象的初始化操作
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)建一個(gè)Student的空對(duì)象
self.__init__(obj, *args, **kwargs) # 執(zhí)行__init__方法 這里需要注意查找順序
return obj # 將實(shí)例化完的對(duì)象返回回去
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__)這就是類的實(shí)例化的整個(gè)過程,不過這是我們通過自定義元類來控制類的調(diào)用,也就是再__call__多些代碼而已
在默認(rèn)元類type里,肯定有__call__方法,該方法下面就是產(chǎn)生個(gè)空對(duì)象,再執(zhí)行__init__方法
先講到這三個(gè)方法,其他那些__dict__,class,__name__這些就不說了
到此這篇關(guān)于Python面向?qū)ο蟮膬?nèi)置方法梳理講解的文章就介紹到這了,更多相關(guān)Python面向?qū)ο髢?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中np.zeros_like函數(shù)用法詳解
這篇文章主要介紹了python中np.zeros_like函數(shù)用法的相關(guān)資料,np.zeros_like是?NumPy?庫中的一個(gè)函數(shù),用于創(chuàng)建一個(gè)與給定數(shù)組形狀和類型相同的新數(shù)組,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
python學(xué)習(xí)入門細(xì)節(jié)知識(shí)點(diǎn)
我們整理了關(guān)于python入門學(xué)習(xí)的一些細(xì)節(jié)知識(shí)點(diǎn),對(duì)于學(xué)習(xí)python的初學(xué)者很有用,一起學(xué)習(xí)下。2018-03-03
python tkinter實(shí)現(xiàn)鼠標(biāo)懸停提示
這篇文章主要為大家詳細(xì)介紹了python如何使用tkinter控件實(shí)現(xiàn)鼠標(biāo)懸停提示以及提示文本動(dòng)態(tài)展示,文中的示例代碼講解詳細(xì),有需要的可以參考下2024-11-11
簡(jiǎn)述python四種分詞工具,盤點(diǎn)哪個(gè)更好用?
這篇文章主要介紹了python四種分詞工具的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
python網(wǎng)絡(luò)爬蟲精解之Beautiful Soup的使用說明
簡(jiǎn)單來說,Beautiful Soup 是 python 的一個(gè)庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù),Beautiful Soup 提供一些簡(jiǎn)單的、python 式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能,需要的朋友可以參考下2021-09-09

