python中的類與self

使用Python有一段時(shí)間了怀樟,感覺小蟒蛇是門在很多方面很給力的語言开皿,不光是它強(qiáng)大的函數(shù)式編程,還有他它的可以不創(chuàng)建類和對(duì)象來實(shí)現(xiàn)面向?qū)ο竽J降拇蟛糠止δ堋康氖撬鼜?qiáng)大的數(shù)據(jù)類型畅铭,列表和字典譬重。

用字典的鍵來代表對(duì)象的屬性,直接賦值簿训,方法所有人公用咱娶。對(duì)于我這樣的新手來說,這招可說是屢試不爽强品,簡(jiǎn)單的小功能小游戲輕松搞定膘侮,有效減少了代碼編寫量與思考時(shí)間,甚至很多時(shí)候我忘了它是們面向?qū)ο蟮恼Z言了的榛。然而喻喳,有些情況下(雖然我還沒遇到),python中類和對(duì)象可能還是要的困曙。本著技多不壓身的原則表伦,今天我就現(xiàn)學(xué)現(xiàn)賣,給大家介紹一下Python中的類與對(duì)象的使用慷丽。同時(shí)蹦哼,也替小蟒蛇證明一下,咱真的是面向?qū)ο蟮恼Z言要糊!

一纲熏、python中的類

簡(jiǎn)單介紹下python中的類,首先是類的定義格式:

Python代碼

classstudent(object):

......

怎么樣锄俄,夠簡(jiǎn)潔吧局劲?去掉了一切多余的東西,Python中的類定義被縮到了最簡(jiǎn)——只要一個(gè)class關(guān)鍵字奶赠,一個(gè)類名即可鱼填,當(dāng)然,你也可以加個(gè)括號(hào)指定繼的父類毅戈。

創(chuàng)建對(duì)象的方法同樣也很簡(jiǎn)潔:

Python代碼

s?=?student()

與java不同苹丸,這里連new關(guān)鍵字都去掉了愤惰,自我猜測(cè)與python內(nèi)部架構(gòu)不同有關(guān),后面有機(jī)會(huì)再研究赘理。

然后宦言,是類的初始化函數(shù),創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用:

Python代碼

def__init__(self)?:

#要執(zhí)行的初始化操作

你可以同時(shí)為自己的類設(shè)定屬性并賦初值商模,實(shí)現(xiàn)構(gòu)造方法的功能:

Python代碼

def__init__(self,?age?=20,?school?=?‘HNU’?):

self.age?=?age

selfschool?=?school

這里注意兩點(diǎn):

1 init 函數(shù)名的兩側(cè)分別要有兩個(gè)下劃線 _? (注意是兩個(gè)哦)

2 init 方法須有參數(shù)且的第一個(gè)參數(shù)必須為self(其實(shí)也不是死規(guī)定奠旺,這個(gè)后面會(huì)講)

這樣的限定似乎和python自由的原則稍有違背,但為了更大的自由施流,這點(diǎn)犧牲也是迫不得已啊响疚,因?yàn)檫@樣系統(tǒng)可以”認(rèn)出”這個(gè)函數(shù),至于self后面會(huì)講嫂沉。

最后,你可以向java里那樣給你的類賦予其他的屬性和方法

Python代碼

defset_name(self,name):

self.name?=?name

defcodeing(self,?language?=?‘Python’):

printself.name?+?‘在寫’?+?language

二?扮碧、解秘self

看了前面幾個(gè)例子趟章,你大概發(fā)現(xiàn)了:凡是python類中的所有方法都要有一個(gè)self參數(shù),而且這個(gè)self似乎和java中的this關(guān)鍵字很像慎王。

沒錯(cuò)蚓土,這個(gè)self確實(shí)和this很像,但是這二者還是有蠻大區(qū)別的赖淤,為了更好地理解self蜀漆,我們不妨多問幾個(gè)為什么:

1? self是什么?

想知道這個(gè)self本質(zhì)是什么咱旱,最直接的方法就是打印了确丢。為此,我們建立一個(gè)簡(jiǎn)單的類people吐限,實(shí)例化時(shí)會(huì)打印self:

Python代碼

classpeople:

def__init__(self):

printself

按F5運(yùn)行鲜侥,輸入測(cè)試代碼:

Python代碼

p?=?people()

得到打印的結(jié)果:

Python代碼


<__main__.people?instance?at0x0206D5F8>

不管__main__是啥,我們至少知道了诸典,self是people在內(nèi)存地址0x0206D5F8處的實(shí)例描函。因此,self在這里與java中的this一樣狐粱,代表的都是當(dāng)前對(duì)象的地址舀寓,可以用來調(diào)用當(dāng)前類中的屬性和方法,實(shí)例見上肌蜻。

2 self與this有什么不同互墓?

首先,與多數(shù)時(shí)候可以省略的this不同蒋搜,self在任何情況下絕不能省略轰豆。對(duì)于這點(diǎn)胰伍,我是這樣理解的:與java中的class不同,python中的class本質(zhì)上是一個(gè)變量酸休,只不過它里面的函數(shù)和屬性我們可以自定義骂租,所有的方法調(diào)用都要由類本身來執(zhí)行,而對(duì)象名反而成為了參數(shù)斑司,看起來就python在和我們玩一個(gè)文字游戲渗饮,舉個(gè)例子:

Python代碼

s?=?student()

這是條創(chuàng)建對(duì)象的語句,python在執(zhí)行時(shí)做了一個(gè)變換:

Python代碼


student.__init__(s)

同樣的,

Python代碼


s.coding('python')

在執(zhí)行時(shí)換成了:

Python代碼


student.coding(s,'python')

所以宿刮,我們很容易理解為什么類中的方法必須要帶self參數(shù)了互站。是python與java中class的不同決定了this和self本質(zhì)的不同。

2 self一定非得是self嗎僵缺?

你也許感覺到了胡桃,self其實(shí)就是一個(gè)普通參數(shù),所以磕潮,self在python中不能算是關(guān)鍵字翠胰,因?yàn)槟憧梢越o他任意起名——myself、yourself啥都沒問題自脯,甚至abc這種腦殘名字都可以的之景,所以,你大可這樣做:

Python代碼


defmust_self(not_self):

Print?not_self

執(zhí)行這個(gè)函數(shù)

Python代碼


p.must_self()

最后還是可以得到打印的結(jié)果:

<__main__.people?instance?at0x0206D5F8>

因此膏潮,self在python中不算是關(guān)鍵字锻狗,它只是當(dāng)前對(duì)象的地址的一個(gè)象征,我們可以任意命名焕参,只不過為了交流方便轻纪,python社區(qū)中約定俗成地把它叫做self,你也完全不必墨守成規(guī)叠纷。

3 self還有什么用?

好了桐磁,到此為止我們探討了self的本質(zhì),并且知道讲岁,self可以實(shí)現(xiàn)java中this的全部功能我擂,但是,你或許想問缓艳,它難道就沒有更多的用途了嗎校摩?

其實(shí)是有的,那就是區(qū)分全局變量函數(shù)和類中的變量函數(shù)阶淘。(有篇博客作者把這叫做“防止非限定調(diào)用引起的全局變量”衙吩,一開始搞得我一頭霧水,不知道他怎么想的)

Python中溪窒,類之外可以定義很多全局變量和函數(shù)坤塞,這是它與java明顯的不同冯勉。為了解釋器準(zhǔn)確的找到函數(shù)或變量,需要使用self來限定方法變量的區(qū)域摹芙,這樣解釋器就能快速知道你調(diào)用的是類中的變量還是全局的變量了灼狰。例子如下:

Python代碼


a?=1

defsay():

print'調(diào)用了全局方法'

classpeople:

a?=100

defsay(self):

print'調(diào)用了類的方法'

defdo(self):

say()

print'a?=?',a

這里我們定義了兩對(duì)同名的變量和函數(shù),a和say浮禾,看一看do方法會(huì)執(zhí)行哪一個(gè)

Python代碼


p?=?people()

p.do()

運(yùn)行結(jié)果:

Python代碼


調(diào)用了全局方法

a?=1

顯然交胚,變量重名并不影響調(diào)用,而在不用self限定時(shí)盈电,系統(tǒng)會(huì)默認(rèn)調(diào)用全局變量和方法蝴簇,只有用self才能調(diào)用類自己的方法和變量 :

Python代碼


a?=1

defsay():

print'調(diào)用了全局方法'

classpeople:

a?=100

defsay(self):

print'調(diào)用了類的方法'

defdo(self):

say()

self.say()

print'a?=?',?a

print'self.a?=?',self.a

p?=?people()

p.do()

運(yùn)行結(jié)果:

調(diào)用了全局方法

調(diào)用了類的方法

a?=1

self.a?=100

好了,關(guān)于類的使用與self大概就介紹這些匆帚,但不知道你們有沒有這種感覺熬词,那就是python中使用類有點(diǎn)怪怪的,當(dāng)然吸重,很大一部分原因和那無所不在的self有關(guān)互拾。不過,我的觀點(diǎn)是晤锹,python的創(chuàng)始者也不支持你在程序中使用類摩幔。因?yàn)閺?qiáng)大的字典和列表已經(jīng)可以輕松實(shí)現(xiàn)類的很多功能彤委,所以類存在的必要性并不是特別大鞭铆。而且,想要把java的開發(fā)模式硬搬到python里也無疑是個(gè)愚蠢的決定焦影,因?yàn)樵谖已壑谐邓欤琾ython是門比java高級(jí)的多,也靈活得多的語言斯辰,它有自己的Coding

style舶担,不要盲從他人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彬呻,一起剝皮案震驚了整個(gè)濱河市衣陶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闸氮,老刑警劉巖剪况,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蒲跨,居然都是意外死亡译断,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門或悲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孙咪,“玉大人堪唐,你說我怎么就攤上這事◆岬福” “怎么了淮菠?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杨蛋。 經(jīng)常有香客問我兜材,道長(zhǎng),這世上最難降的妖魔是什么逞力? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任曙寡,我火速辦了婚禮,結(jié)果婚禮上寇荧,老公的妹妹穿的比我還像新娘举庶。我一直安慰自己,他們只是感情好揩抡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布户侥。 她就那樣靜靜地躺著,像睡著了一般峦嗤。 火紅的嫁衣襯著肌膚如雪蕊唐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天烁设,我揣著相機(jī)與錄音替梨,去河邊找鬼。 笑死装黑,一個(gè)胖子當(dāng)著我的面吹牛副瀑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恋谭,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼糠睡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疚颊?” 一聲冷哼從身側(cè)響起狈孔,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎材义,沒想到半個(gè)月后均抽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡母截,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年到忽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喘漏,死狀恐怖护蝶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翩迈,我是刑警寧澤持灰,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站负饲,受9級(jí)特大地震影響堤魁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜返十,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一妥泉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洞坑,春花似錦盲链、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至排拷,卻和暖如春侧漓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背监氢。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工布蔗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忙菠。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓何鸡,卻偏偏與公主長(zhǎng)得像纺弊,于是被迫代替她去往敵國和親牛欢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法淆游,類相關(guān)的語法傍睹,內(nèi)部類的語法,繼承相關(guān)的語法犹菱,異常的語法拾稳,線程的語...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • 小沈的本名叫什么我不知道,只知道他姓沈腊脱,安微六安人访得。小沈說他今年三十有六,十六歲來上海打工,也算老上海了悍抑,不過還是...
    湖邊人老劉閱讀 616評(píng)論 0 1
  • 把知識(shí)變成技術(shù)鳄炉,這也是弓醫(yī)生說過的話。學(xué)到技術(shù)搜骡,改變思維拂盯。
    freshriver閱讀 54評(píng)論 0 0
  • 今天繼續(xù)給大家講小青蛙弗洛格的故事~睡衣晚會(huì)。 弗洛格记靡、小鴨和野兔在小豬家過夜—他們?cè)陂_"睡衣晚會(huì)"√父停現(xiàn)在他們?cè)谕?..
    高田GT閱讀 1,388評(píng)論 1 1