跟老齊學(xué)Python之編寫類之二方法
數(shù)據(jù)流轉(zhuǎn)過程
除了在類中可以寫這種函數(shù)之外,在類中還可以寫別的函數(shù),延續(xù)上一講的例子:
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="
self.name = name
self.lang = lang
self.website = website
self.email = "qiwsir@gmail.com"
def author(self):
return self.name
laoqi = Person("LaoQi")
info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author()
print "Author name from info:",info.author()
#運(yùn)行結(jié)果
Author name from laoqi: LaoQi
Author name from info: qiwsir
看官可能已經(jīng)注意了,這段代碼比上一講多了一個函數(shù)author(self),這個我們先不管,稍后會詳細(xì)分解。首先看看數(shù)據(jù)是如何在這個代碼中流轉(zhuǎn)的。為了能夠清楚,畫一張圖,所謂一圖勝千言萬語,有圖有真相。
定義類Person,然后創(chuàng)建實(shí)例laoqi=Person("LaoQi"),看官注意觀察圖上的箭頭方向。laoqi這個實(shí)例和Person類中的self對應(yīng),它們都是引用了實(shí)例對象(很多時候簡化說成是實(shí)例對象)。"LaoQi"是一個具體的數(shù)據(jù),通過構(gòu)造函數(shù)中的name參數(shù),傳給實(shí)例的屬性self.name,在類Person中的另外一個方法author的參數(shù)列表中第一個就是self,表示要承接self對象,return self.name,就是在類內(nèi)部通過self對象,把它的屬性self.name的數(shù)據(jù)傳導(dǎo)如author。
當(dāng)運(yùn)行l(wèi)aoqi.author()的時候,就是告訴上面的代碼,調(diào)用laoqi實(shí)例對象,并得到author()方法的結(jié)果,laoqi這個實(shí)例就自動被告訴了author()(注意,self參數(shù)在這里不用寫,這個告訴過程是python自動完成的,不用我們操心了),author方法就返回laoqi實(shí)例的屬性,因?yàn)榍懊嬉呀?jīng)完成了laoqi與self的對應(yīng)過程,所以這時候author里面的self就是laoqi,自然self.name=laoqi.name。
看官可以跟隨我在做一個實(shí)驗(yàn),那就是在author中,return laoqi.name,看看什么效果。因?yàn)榧热籰aoqi和self是同一個實(shí)例對象,直接寫成laoqi.name是不是也可以呢?
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="
self.name = name
self.lang = lang
self.website = website
self.email = "qiwsir@gmail.com"
def author(self):
#return self.name
return laoqi.name #返回
laoqi = Person("LaoQi")
info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author()
print "Author name from info:",info.author()
#輸出結(jié)果
Author name from laoqi: LaoQi #laoqi實(shí)例輸出結(jié)果
Author name from info: LaoQi #info實(shí)例輸出結(jié)果
從結(jié)果中可以看出,沒有報錯。但是,info這個實(shí)例輸出的結(jié)果和laoqi實(shí)例輸出的結(jié)果一樣。原來,當(dāng)調(diào)用了info實(shí)例之后,運(yùn)行到author(),返回的是laoqi.name。所以,這里一定要用self實(shí)例。在調(diào)用不同的實(shí)例時,self會自動的進(jìn)行匹配,當(dāng)然,匹配過程是python完成,仍然不用我們操心。
OK,數(shù)據(jù)流轉(zhuǎn)過程,看官是否理解了呢?下面進(jìn)入方法編寫的環(huán)節(jié)
為什么要用到方法
在類里面,可以用def語句來編寫函數(shù),但是,通常這個函數(shù)的樣子是這樣的:
class ClassName:
def __init__(self,*args):
...
def method(self,*args): #是一個在類里面的函數(shù)
...
在類ClassName里面,除了前面那個具有初始化功能的構(gòu)造函數(shù)之外,還有一個函數(shù)method,這個函數(shù)和以前學(xué)習(xí)過的函數(shù)一樣,函數(shù)里面要寫什么,也沒有特別的規(guī)定。但是,這個函數(shù)的第一個參數(shù)必須是self,或者說,可以沒有別的參數(shù),但是self是必須寫上并且是第一個。這個self參數(shù)的作用前面已經(jīng)說過了。
這樣看來,類里面的這個函數(shù)還有點(diǎn)跟以前函數(shù)不同的地方。
類里面的這個函數(shù),我們就稱之為方法。
之所以用方法,也是用類的原因,也是用函數(shù)的原因,都是為了減少代碼的冗余,提高代碼的重用性,這也是OOP的原因。
方法怎樣被重用呢?看本最開始的那段代碼,里面有一個author方法,不管是laoqi還是info實(shí)例,都用這個方法返回實(shí)例導(dǎo)入的名字。這就是體現(xiàn)了重用。
編寫和操作方法
編寫方法的過程和編寫一個函數(shù)的過程一樣,需要注意的就是要在參數(shù)列表中第一個寫上self,即使沒有其它的參數(shù)。
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="
self.name = name
self.lang = lang
self.website = website
self.email = "qiwsir@gmail.com"
def author(self, address):
#return self.name
return laoqi.name+" in "+address
laoqi = Person("LaoQi")
info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author("China")
print "Author name from info:",info.author("Suzhou")
#運(yùn)行結(jié)果
Author name from laoqi: LaoQi in China
Author name from info: LaoQi in Suzhou
這段代碼中,對author方法增加了一個參數(shù)address,當(dāng)調(diào)用這個方法的時候:laoqi.author("China"),要對這個參數(shù)賦值,看官特別注意,在類中,這個方法顯示是有兩個參數(shù)(self,address),但是在調(diào)用的時候,第一個參數(shù)是自動將實(shí)例laoqi與之對應(yīng)起來,不需要顯化賦值,可以理解成是隱含完成的(其實(shí),也可以將laoqi看做隱藏的主體,偷偷地更self勾搭上了)。
通過上面的講述,看官可以試試類了。提醒,一定要對類的數(shù)據(jù)流通過程清晰。
相關(guān)文章
Python使用jupyter notebook查看ipynb文件過程解析
這篇文章主要介紹了Python使用jupyter notebook查看ipynb文件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Python入門_淺談for循環(huán)、while循環(huán)
下面小編就為大家?guī)硪黄狿ython入門_淺談for循環(huán)、while循環(huán)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05python隊(duì)列原理及實(shí)現(xiàn)方法示例
這篇文章主要介紹了python隊(duì)列原理及實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python隊(duì)列的概念、原理、定義及基本操作技巧,需要的朋友可以參考下2019-11-11python使用JSON模塊進(jìn)行數(shù)據(jù)處理(編碼解碼)
這篇文章主要為大家介紹了python使用JSON模塊進(jìn)行數(shù)據(jù)處理編碼解碼的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06用?Python?腳本實(shí)現(xiàn)電腦喚醒后自動拍照并截屏發(fā)郵件通知
這篇文章主要介紹了用?Python?腳本實(shí)現(xiàn)電腦喚醒后自動拍照并截屏發(fā)郵件通知,文中詳細(xì)的介紹了代碼示例,具有一定的 參考價值,感興趣的可以了解一下2023-03-03Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解
這篇文章主要介紹了Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02