python init self_转载--------Python中:self和__init__的含义 + 为何要有self和__init__
背景
Python中的self,__init__的含義是啥?為何要有self,__init這些東西?
解釋之前,先說(shuō)幾句
1.到目前為止,我雖然也已寫(xiě)了不算很少的python的代碼,但是,還真的沒(méi)有太多接觸self和__init__這兩個(gè)東西。只能算是大概了解。
2.為了搞懂其含義,現(xiàn)學(xué)現(xiàn)賣,去看了些資料,然后整理出來(lái)。其中,很可能理解有誤,還請(qǐng)高手指正。
3.解釋含義之前,先說(shuō)說(shuō)對(duì)于學(xué)習(xí)Python中的self和__init__等內(nèi)容的態(tài)度:
個(gè)人的建議是,很多東西,等你有了需求了,再去使用,該東西才算有價(jià)值,你也才會(huì)更容易理解;否則,暫時(shí)接觸不到的話,其實(shí)可以將其放到一邊,等以后遇到了再說(shuō)。
否則,現(xiàn)在就去努力的學(xué),態(tài)度雖好,但是由于沒(méi)有相關(guān)的編程實(shí)踐,即沒(méi)有足夠的代碼的練習(xí),對(duì)于概念的理解,必然很難深入。
因此,對(duì)于Python中的self和__init__的建議是:
如果你去寫(xiě)Python代碼,去學(xué)習(xí)Python的過(guò)程中,在沒(méi)有遇到之前,
比如像我這種,一直就沒(méi)怎么編寫(xiě)過(guò)真正的類(Class),那么倒也是可以暫時(shí)不用太理會(huì)這些東西;等以后需要編寫(xiě)類的時(shí)候,再去詳細(xì)學(xué)習(xí),了解,搞懂其含義。
4.下面的內(nèi)容,算是為你,的確遇到了self,__init__,的時(shí)候,需要理解其含義的時(shí)候,提供一些參考。
5.在看下面的解釋之前,你首先要對(duì)類(Class)和類的實(shí)例化的對(duì)象(Object,也稱實(shí)例Instance)的概念,有所了解。
如果不了解,可以參考我總結(jié)的:
python中self和__init__的含義 + 為何要有self和__init__
1. Python中的self
在Python中的類Class的代碼中,常看到函數(shù)中的第一個(gè)參數(shù),都是self。
以及Class中的函數(shù)里面,訪問(wèn)對(duì)應(yīng)的變量(讀取或者寫(xiě)入),以及調(diào)用對(duì)應(yīng)的函數(shù)時(shí),都是self.valueName,self.function()的形式。
下面就來(lái)解釋一下self的含義:
Python中self的含義
self,英文單詞意思很明顯,表示自己,本身。
此處有幾種潛在含義:
1.這里的自己,指的是,實(shí)例Instance本身。
2.同時(shí), 由于說(shuō)到“自己”這個(gè)詞,都是和相對(duì)而言的“其他”而說(shuō)的。而此處的其他,指的是:類Class與其他變量(比如局部變量,全局變量)等。
此處的self,是個(gè)對(duì)象,Object。是當(dāng)前類的實(shí)例。因此,對(duì)應(yīng)的self.valueName,self.function()中的
valueName:表示self對(duì)象,即實(shí)例的變量。與其他的,Class的變量,全局的變量,局部的變量,是相對(duì)應(yīng)的。
function:表示是調(diào)用的是self對(duì)象,即實(shí)例的函數(shù)。與其他的全局的函數(shù),是相對(duì)應(yīng)的。
2.Python中為何要有self
上面其實(shí)已經(jīng)基本上說(shuō)清楚了,為何需要有self。
那就是:
在類的代碼(函數(shù))中,需要訪問(wèn)當(dāng)前的實(shí)例中的變量和函數(shù)的,即,訪問(wèn)Instance中的:
對(duì)應(yīng)的變量(property):Instance.ProperyNam,去讀取之前的值和寫(xiě)入新的值
調(diào)用對(duì)應(yīng)函數(shù)(function):Instance.function(),即執(zhí)行對(duì)應(yīng)的動(dòng)作
-> 而需要訪問(wèn)實(shí)例的變量和調(diào)用實(shí)例的函數(shù),當(dāng)然需要對(duì)應(yīng)的實(shí)例Instance對(duì)象本身
-> 而Python中就規(guī)定好了,函數(shù)的第一個(gè)參數(shù),就必須是實(shí)例對(duì)象本身,并且建議,約定俗成,把其名字寫(xiě)為self
-> 所以,我們需要self(需要用到self)
而如果沒(méi)有用到self,即代碼中,去掉self后,那種寫(xiě)法所使用到的變量,實(shí)際上不是你所希望的,不是真正的實(shí)例中的變量和函數(shù),而是的訪問(wèn)到了其他部分的變量和函數(shù)了。
甚至?xí)捎跊](méi)有合適的初始化實(shí)例變量,而導(dǎo)致后續(xù)無(wú)法訪問(wèn)的錯(cuò)誤。
下面,就通過(guò)代碼,來(lái)演示,如果去掉self,或者沒(méi)有合理的使用self,會(huì)出現(xiàn)哪些錯(cuò)誤。
如果沒(méi)有在__init__中初始化對(duì)應(yīng)的實(shí)例變量的話,導(dǎo)致后續(xù)引用實(shí)例變量會(huì)出錯(cuò)
如下代碼,完整的演示了,如果沒(méi)有在類Class的最初的__init__函數(shù)中,正確的初始化實(shí)例變量,則會(huì)導(dǎo)致后續(xù)沒(méi)有變量可用,因而出現(xiàn)AttributeError的錯(cuò)誤:
從上述代碼可見(jiàn),由于在類的初始化(實(shí)例化)的__init__函數(shù)中,沒(méi)有給self.name設(shè)置值,使得實(shí)例中,根本沒(méi)有name這個(gè)變量,導(dǎo)致后續(xù)再去訪問(wèn)self.name,就會(huì)出現(xiàn)AttributeError的錯(cuò)誤了。
對(duì)應(yīng)的,如果寫(xiě)成self.name,則意思就正確了,就是初始化的時(shí)候,給實(shí)例中新增加,并且正常設(shè)置了正確的值newPersionName了,所以后續(xù)再去通過(guò)self.name,就可以訪問(wèn)到,當(dāng)前實(shí)例中正確的變量name了。
相應(yīng)的正確寫(xiě)法的代碼如下:
在函數(shù)中,使用對(duì)應(yīng)的變量,雖然代碼是可以運(yùn)行的,但是實(shí)際上卻是使用的,不是實(shí)例中的變量
有時(shí)候,雖然你寫(xiě)的代碼,可以運(yùn)行,但是使用到的變量,由于沒(méi)有加self,實(shí)際上是用到的不是實(shí)例的變量,而是其他的變量(有可能是類變量)。
此類問(wèn)題,主要和Python中的變量的作用域有關(guān),但是此處例子中,也和是否使用self有關(guān):
其中,可見(jiàn),此處開(kāi)始__init__中,沒(méi)有給self實(shí)例初始化對(duì)應(yīng)的name
而后面的函數(shù)sayYourName中,雖然可以調(diào)用到self.name而沒(méi)有出現(xiàn)AttributeError錯(cuò)誤
但是實(shí)際上此處的值,不是所期望的,傳入的name,即"crifan",而是類中的name的值,即"class global name"。
關(guān)于Python中變量的作用域的詳細(xì)解釋,可參考:
3.Python中的__init__
Python中,常會(huì)看到,很多類中,都有一個(gè)__init__函數(shù)。
下面就來(lái)解釋一下,__init__的含義。
Python中__init__的含義
首先來(lái)看init單詞本身,其含義是 初始化。
而__init__的含義,也如同其單詞本意一樣,用來(lái)初始化。
但是給誰(shuí)初始化呢?
很明顯,是給對(duì)應(yīng)的類Class本身,去初始化。
Python中為何要有__init__
我的理解是,__init__的出現(xiàn),主要有兩方面的作用:
一般常見(jiàn)的初始化,我的理解,可能主要有兩方面:
支持帶參數(shù)的類的初始化
這個(gè)用法,感覺(jué)就像,其他語(yǔ)言中的,對(duì)于Class初始化時(shí),可以運(yùn)行傳遞不同的參數(shù)一樣;
用代碼演示如下:
其中,就是針對(duì)Person這個(gè)類,
不同的示例,在初始化的時(shí)候,都傳遞一個(gè)對(duì)應(yīng)的參數(shù),這樣不同的Person,就都有了自己的不同的名字了。
這個(gè),至少看起來(lái),有點(diǎn)類似于,其他語(yǔ)言中的,傳遞特定參數(shù)去對(duì)類進(jìn)行初始化。
實(shí)現(xiàn)類本身相關(guān)內(nèi)容的初始化
當(dāng)一個(gè)Class,稍微復(fù)雜一點(diǎn)的時(shí)候,或者內(nèi)部函數(shù)需要用得到的時(shí)候,往往都需要在,別人實(shí)例化你這個(gè)類之前,使用你這個(gè)類之前,做一些基本的,與自己的類有關(guān)的,初始化方面的工作。
而這部分工作,往往就放到__init__函數(shù)中去了。
換句話說(shuō),你要用人家的類(中的變量和函數(shù))之前,總要給人家一個(gè)機(jī)會(huì),做點(diǎn)準(zhǔn)備工作,然后才能為你服務(wù)吧。
這個(gè)概念,相對(duì)還是很好理解的,就不多贅述。
演示代碼就不用了,因?yàn)樯厦娴拇a,也可以算是這方面的例子了,不同的人,應(yīng)該有不同的名字,而給不同的人設(shè)置不同的名字,也是需要在調(diào)用sayYourName之前,就先初始化好的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python init self_转载--------Python中:self和__init__的含义 + 为何要有self和__init__的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: lacp静态和动态区别_lacp静态与动
- 下一篇: 苏嵌第一天,shell中一些基础知识