上一講中建立了類,並且重點講述了建構函式以及類例項,特別是對那個self,描述了不少。在講述建構函式的時候特別提到,init()是乙個函式,只不過在類中有一點特殊的作用罷了,每個類,首先要執行它,它規定了類的基本結構。
#!/usr/bin/env python
#coding:utf-8
class person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "[email protected]"
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()
#執行結果
author name from laoqi: laoqi
author name from info: qiwsir
看官可能已經注意了,這段**比上一講多了乙個函式author(self),這個我們先不管,稍後會詳細分解。首先看看資料是如何在這個**中流轉的。為了能夠清楚,畫一張圖,所謂一圖勝千言萬語,有圖有真相。
定義類person,然後建立例項laoqi=person("laoqi"),看官注意觀察圖上的箭頭方向。laoqi這個例項和person類中的self對應,它們都是引用了例項物件(很多時候簡化說成是例項物件)。"laoqi"是乙個具體的資料,通過建構函式中的name引數,傳給例項的屬性self.name,在類person中的另外乙個方法author的引數列表中第乙個就是self,表示要承接self物件,return self.name,就是在類內部通過self物件,把它的屬性self.name的資料傳導如author。
當執行laoqi.author()的時候,就是告訴上面的**,呼叫laoqi例項物件,並得到author()方法的結果,laoqi這個例項就自動被告訴了author()(注意,self引數在這裡不用寫,這個告訴過程是python自動完成的,不用我們操心了),author方法就返回laoqi例項的屬性,因為前面已經完成了laoqi與self的對應過程,所以這時候author裡面的self就是laoqi,自然self.name=laoqi.name。
看官可以跟隨我在做乙個實驗,那就是在author中,return laoqi.name,看看什麼效果。因為既然laoqi和self是同乙個例項物件,直接寫成laoqi.name是不是也可以呢?
#!/usr/bin/env python
#coding:utf-8
class person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "[email protected]"
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()
#輸出結果
author name from laoqi: laoqi #laoqi例項輸出結果
author name from info: laoqi #info例項輸出結果
從結果中可以看出,沒有報錯。但是,info這個例項輸出的結果和laoqi例項輸出的結果一樣。原來,當呼叫了info例項之後,執行到author(),返回的是laoqi.name。所以,這裡一定要用self例項。在呼叫不同的例項時,self會自動的進行匹配,當然,匹配過程是python完成,仍然不用我們操心。
ok,資料流轉過程,看官是否理解了呢?下面進入方法編寫的環節
在類裡面,可以用def語句來編寫函式,但是,通常這個函式的樣子是這樣的:
class classname:
def __init__(self,*args):
...def method(self,*args): #是乙個在類裡面的函式
...
在類classname裡面,除了前面那個具有初始化功能的建構函式之外,還有乙個函式method,這個函式和以前學習過的函式一樣,函式裡面要寫什麼,也沒有特別的規定。但是,這個函式的第乙個引數必須是self,或者說,可以沒有別的引數,但是self是必須寫上並且是第乙個。這個self引數的作用前面已經說過了。
這樣看來,類裡面的這個函式還有點跟以前函式不同的地方。
類裡面的這個函式,我們就稱之為方法。
之所以用方法,也是用類的原因,也是用函式的原因,都是為了減少**的冗餘,提高**的重用性,這也是oop的原因。
方法怎樣被重用呢?看本最開始的那段**,裡面有乙個author方法,不管是laoqi還是info例項,都用這個方法返回例項匯入的名字。這就是體現了重用。
編寫方法的過程和編寫乙個函式的過程一樣,需要注意的就是要在引數列表中第乙個寫上self,即使沒有其它的引數。
#!/usr/bin/env python
#coding:utf-8
class person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "[email protected]"
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")
#執行結果
author name from laoqi: laoqi in china
author name from info: laoqi in suzhou
這段**中,對author方法增加了乙個引數address,當呼叫這個方法的時候:laoqi.author("china"),要對這個引數賦值,看官特別注意,在類中,這個方法顯示是有兩個引數(self,address),但是在呼叫的時候,第乙個引數是自動將例項laoqi與之對應起來,不需要顯化賦值,可以理解成是隱含完成的(其實,也可以將laoqi看做隱藏的主體,偷偷地更self勾搭上了)。
通過上面的講述,看官可以試試類了。提醒,一定要對類的資料流通過程清晰。
零基礎學Python
零基礎學python 1 1 python是一門指令碼語言 2 python的優勢 1 語法和結構比較簡單,易入門 2 能夠跨平台使用 3 應用範圍廣,設計到作業系統 3d動畫 web 雲計算,企業應用等多方面。3 idle 是乙個python shell,類似於windows的cmd視窗 4 pr...
零基礎學python 類的細節
前面對類的有關內容已經描述不少了,其實話題遠遠沒有結束,不過對於初學者,掌握這些已經算是入門,在以後的實踐中,還需要進行體會和感悟。大家對oop有不同看法,所謂工程派和學院派看法不一致。從應用的角度看,工程派的觀點是值得推薦的,那就是 不用太在意內部是怎麼工作的,只要能夠解決眼下的問題即可。但是,對...
零基礎學python 編寫類之四再論繼承
usr bin env python coding utf 8 class person def init self,name,email self.name name self.email email class programmer person def init self,name,email...