Python面向?qū)ο缶幊獭菊Z(yǔ)法
一、類(lèi)的語(yǔ)法
上一節(jié)最后的代碼其實(shí)有問(wèn)題,屬性名字和年齡都寫(xiě)死了,想傳名字傳不進(jìn)去。
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alex", 22)
print(p.name, p.age)
為什么有__init__? 為什么有self? 此時(shí)的你一臉蒙逼,相信不畫(huà)個(gè)圖,你的智商是理解不了的!
畫(huà)圖之前, 你先注釋掉這兩句
# p = Person("Alex", 22)
# print(p.name, p.age)
#加上句
print(Person)
#執(zhí)行結(jié)果
這代表什么?代表 即使不實(shí)例化,這個(gè)Person類(lèi)本身也是已經(jīng)存在內(nèi)存里的對(duì)不對(duì), yes, cool,那實(shí)例化時(shí),會(huì)產(chǎn)生什么化學(xué)反應(yīng)呢?
其實(shí)self,就是實(shí)例本身!你實(shí)例化時(shí)python解釋器會(huì)自動(dòng)把這個(gè)實(shí)例本身通過(guò)self參數(shù)傳進(jìn)去。
你說(shuō)好吧,假裝懂了,但是這么干有什么好處呢?想了解self的好處,得給Person類(lèi)加個(gè)功能
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print("Hello, my name is %s, I'm %s years old!" % (self.name, self.age))
p = Person("Alex", 22)
# print(p.name, p.age)
p.talk() #注意這里調(diào)用并未傳遞參數(shù)
執(zhí)行輸出
Hello, my name is Alex, I'm 22 years old!
為何p.talk()未傳參數(shù)不報(bào)錯(cuò),且為何talk方法定義要跟一個(gè)self參數(shù)?
我們上面講到self其實(shí)是實(shí)例本身, 那p.talk() 其實(shí)相當(dāng)于p.talk(p),你不需要自己把p實(shí)例傳進(jìn)去,解釋器幫你干了,那為何要在talk定義時(shí)加self參數(shù)呢?
是因?yàn)椋愕膖alk方法里有調(diào)用到實(shí)例的屬性呀,這些屬性又都是綁定在實(shí)例上的,你想調(diào)用實(shí)例屬性,就必須要把實(shí)例傳進(jìn)去。
構(gòu)造方法:
__init__(...)
被稱(chēng)為 構(gòu)造方法或初始化方法,在例實(shí)例化過(guò)程中自動(dòng)執(zhí)行,目的是初始化實(shí)例的一些屬性。每個(gè)實(shí)例通過(guò)
__init__
初始化的屬性都是獨(dú)有的
剛才定義的這個(gè)類(lèi)體現(xiàn)了面向?qū)ο蟮牡谝粋€(gè)基本特性, 封裝,其實(shí)就是使用構(gòu)造方法將內(nèi)容封裝到某個(gè)具體對(duì)象中,然后通過(guò)對(duì)象直接或者self間接獲取被封裝的內(nèi)容
了解了基本定義,下面詳解下類(lèi)的方法和屬性
二、類(lèi)的方法
構(gòu)造方法
剛才上面已經(jīng)說(shuō)了,主要作用是實(shí)例化時(shí)給實(shí)例一些初始化參數(shù),或執(zhí)行一些其它的初始化工作,總之,因?yàn)檫@個(gè)
__init__
只要一實(shí)例化,就會(huì)自動(dòng)執(zhí)行,so不管你在這個(gè)方法里寫(xiě)什么,它都會(huì)統(tǒng)統(tǒng)在實(shí)例化時(shí)執(zhí)行一遍。
普通方法
定義類(lèi)的一些正常功能,比如人這個(gè)類(lèi), 可以說(shuō)話、走路、吃飯等,每個(gè)方法其實(shí)想當(dāng)于一個(gè)功能或動(dòng)作
析構(gòu)方法(解構(gòu)方法)
實(shí)例在內(nèi)存中被刪除時(shí),會(huì)自動(dòng)執(zhí)行這個(gè)方法,如你在內(nèi)存里生成了一個(gè)人的實(shí)例,現(xiàn)在他被打死了,那這個(gè)人除了自己的實(shí)例要被刪除外,可能它在實(shí)例外產(chǎn)生的一些痕跡也要清除掉,清除的動(dòng)作就可以寫(xiě)在這個(gè)方法里。
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print("Hello, my name is %s, I'm %s years old!" % (self.name, self.age))
def __del__(self):
print("running del method, this person must be died.")
p = Person("Alex", 22)
p.talk()
del p
print('--end program--')
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
