Python中__init__的用法和理解示例詳解
Python中__init__的用法和理解
在Python中定義類經(jīng)常會(huì)用到__init__函數(shù)(方法),首先需要理解的是,兩個(gè)下劃線開頭的函數(shù)是聲明該屬性為私有,不能在類的外部被使用或訪問。而__init__函數(shù)(方法)支持帶參數(shù)類的初始化,也可為聲明該類的屬性(類中的變量)。__init__函數(shù)(方法)的第一個(gè)參數(shù)必須為self,后續(xù)參數(shù)為自己定義。
從文字理解比較困難,通過下面的例子能非常容易理解這個(gè)概念:
例如我們定義一個(gè)Box類,有width, height, depth三個(gè)屬性,以及計(jì)算體積的方法:
#!/usr/bin/python # -*- coding utf-8 -*- #Created by Lu Zhan class Box: def setDimension(self, width, height, depth): self.width = width self.height = height self.depth = depth def getVolume(self): return self.width * self.height * self.depth b = Box() b.setDimension(10, 20, 30) print(b.getVolume())
我們?cè)贐ox類中定義了setDimension方法去設(shè)定該Box的屬性,這樣過于繁瑣,而用__init__()這個(gè)特殊的方法就可以方便地自己對(duì)類的屬性進(jìn)行定義,__init__()方法又被稱為構(gòu)造器(constructor)。
#!/usr/bin/python # -*- coding utf-8 -*- #Created by Lu Zhan class Box: #def setDimension(self, width, height, depth): # self.width = width # self.height = height # self.depth = depth def __init__(self, width, height, depth): self.width = width self.height = height self.depth = depth def getVolume(self): return self.width * self.height * self.depth b = Box(10, 20, 30) print(b.getVolume())
補(bǔ)充:Python __init__()類構(gòu)造方法
在創(chuàng)建類時(shí),我們可以手動(dòng)添加一個(gè) __init__() 方法,該方法是一個(gè)特殊的類實(shí)例方法,稱為構(gòu)造方法(或構(gòu)造函數(shù))。
構(gòu)造方法用于創(chuàng)建對(duì)象時(shí)使用,每當(dāng)創(chuàng)建一個(gè)類的實(shí)例對(duì)象時(shí),Python 解釋器都會(huì)自動(dòng)調(diào)用它。Python 類中,手動(dòng)添加構(gòu)造方法的語法格式如下:
def __init__(self,...): ? ? 代碼塊
注意,此方法的方法名中,開頭和結(jié)尾各有 2 個(gè)下劃線,且中間不能有空格。Python 中很多這種以雙下劃線開頭、雙下劃線結(jié)尾的方法,都具有特殊的意義,后續(xù)會(huì)一一為大家講解。
另外,__init__() 方法可以包含多個(gè)參數(shù),但必須包含一個(gè)名為 self 的參數(shù),且必須作為第一個(gè)參數(shù)。也就是說,類的構(gòu)造方法最少也要有一個(gè) self 參數(shù)。例如,仍以 TheFirstDemo 類為例,添加構(gòu)造方法的代碼如下所示:
class TheFirstDemo: ? ? '''這是一個(gè)學(xué)習(xí)Python定義的第一個(gè)類''' ? ? #構(gòu)造方法 ? ? def __init__(self): ? ? ? ? print("調(diào)用構(gòu)造方法") ? ? # 下面定義了一個(gè)類屬性 ? ? add = 'http://c.biancheng.net' ? ? # 下面定義了一個(gè)say方法 ? ? def say(self, content): ? ? ? ? print(content)
注意,即便不手動(dòng)為類添加任何構(gòu)造方法,Python 也會(huì)自動(dòng)為類添加一個(gè)僅包含 self 參數(shù)的構(gòu)造方法。
僅包含 self 參數(shù)的 __init__() 構(gòu)造方法,又稱為類的默認(rèn)構(gòu)造方法。
在上面代碼的后面,頂頭(不縮進(jìn))直接添加如下代碼:
zhangsan = TheFirstDemo()
這行代碼的含義是創(chuàng)建一個(gè)名為 zhangsan 的 TheFirstDemo 類對(duì)象。運(yùn)行代碼可看到如下結(jié)果:
調(diào)用構(gòu)造方法
顯然,在創(chuàng)建 zhangsan 這個(gè)對(duì)象時(shí),隱式調(diào)用了我們手動(dòng)創(chuàng)建的 __init__() 構(gòu)造方法。
不僅如此,在 __init__() 構(gòu)造方法中,除了 self 參數(shù)外,還可以自定義一些參數(shù),參數(shù)之間使用逗號(hào)“,”進(jìn)行分割。例如,下面的代碼在創(chuàng)建 __init__() 方法時(shí),額外指定了 2 個(gè)參數(shù):
class CLanguage: ? ? '''這是一個(gè)學(xué)習(xí)Python定義的一個(gè)類''' ? ? def __init__(self,name,add): ? ? ? ? print(name,"的網(wǎng)址為:",add) #創(chuàng)建 add 對(duì)象,并傳遞參數(shù)給構(gòu)造函數(shù) add = CLanguage("腳本之家","http://www.dbjr.com.cn")
注意,由于創(chuàng)建對(duì)象時(shí)會(huì)調(diào)用類的構(gòu)造方法,如果構(gòu)造函數(shù)有多個(gè)參數(shù)時(shí),需要手動(dòng)傳遞參數(shù),傳遞方式如代碼中所示(后續(xù)章節(jié)會(huì)做詳細(xì)講解)。
運(yùn)行以上代碼,執(zhí)行結(jié)果為:
腳本之家 的網(wǎng)址為: //www.dbjr.com.cn
可以看到,雖然構(gòu)造方法中有 self、name、add 3 個(gè)參數(shù),但實(shí)際需要傳參的僅有 name 和 add,也就是說,self 不需要手動(dòng)傳遞參數(shù)。
關(guān)于 self 參數(shù),后續(xù)章節(jié)會(huì)做詳細(xì)介紹,這里只需要知道,在創(chuàng)建類對(duì)象時(shí),無需給 self 傳參即可。
到此這篇關(guān)于Python中__init__的用法和理解的文章就介紹到這了,更多相關(guān)__init__在python中用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python對(duì)文件目錄的操作方法實(shí)例總結(jié)
這篇文章主要介紹了python對(duì)文件目錄的操作方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)文件目錄相關(guān)的遍歷、刪除、移動(dòng)、查找等操作技巧,需要的朋友可以參考下2019-06-06Blender Python編程創(chuàng)建發(fā)光材質(zhì)示例詳解
這篇文章主要為大家介紹了Blender Python編程創(chuàng)建發(fā)光材質(zhì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08python 使用遞歸的方式實(shí)現(xiàn)語義圖片分割功能
這篇文章主要介紹了python 使用遞歸的方式實(shí)現(xiàn)語義圖片分割,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程
這篇文章主要介紹了在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程,本文選擇以flask框架作為示例,需要的朋友可以參考下2015-05-05如何在Flask中實(shí)現(xiàn)數(shù)據(jù)分組流程詳解
在Flask中,數(shù)據(jù)分組是指將一組數(shù)據(jù)按照某種方式進(jìn)行分類,以便更好地對(duì)數(shù)據(jù)進(jìn)行處理和展示,可以使用Python內(nèi)置的itertools模塊中的groupby方法,或者使用SQL語句中的GROUP?BY子句來實(shí)現(xiàn)數(shù)據(jù)分組,這篇文章介紹了在Flask中實(shí)現(xiàn)數(shù)據(jù)分組,感興趣的同學(xué)可以參考下文2023-05-05