[零基礎學python]編寫類之二方法

上一講中建立了類,而且重點講述了構造函數以及類實例,特別是對那個self,描述了很多。在講述構造函數的時候特別提到,init()是一個函數,只不過在類中有一點特殊的做用罷了,每一個類,首先要運行它,它規定了類的基本結構。python

數據流轉過程

除了在類中能夠寫這種函數以外,在類中還能夠寫別的函數,延續上一講的例子:git

#!/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 = "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()

#運行結果

Author name from laoqi: LaoQi
Author name from info: qiwsir

看官可能已經注意了,這段代碼比上一講多了一個函數author(self),這個咱們先無論,稍後會詳細分解。首先看看數據是如何在這個代碼中流轉的。爲了可以清楚,畫一張圖,所謂一圖勝千言萬語,有圖有真相。github

請輸入圖片描述

定義類Person,而後建立實例laoqi=Person("LaoQi"),看官注意觀察圖上的箭頭方向。laoqi這個實例和Person類中的self對應,它們都是引用了實例對象(不少時候簡化說成是實例對象)。"LaoQi"是一個具體的數據,經過構造函數中的name參數,傳給實例的屬性self.name,在類Person中的另一個方法author的參數列表中第一個就是self,表示要承接self對象,return self.name,就是在類內部經過self對象,把它的屬性self.name的數據傳導如author。golang

當運行laoqi.author()的時候,就是告訴上面的代碼,調用laoqi實例對象,並獲得author()方法的結果,laoqi這個實例就自動被告訴了author()(注意,self參數在這裏不用寫,這個告訴過程是python自動完成的,不用咱們操心了),author方法就返回laoqi實例的屬性,由於前面已經完成了laoqi與self的對應過程,因此這時候author裏面的self就是laoqi,天然self.name=laoqi.name。web

看官能夠跟隨我在作一個實驗,那就是在author中,return laoqi.name,看看什麼效果。由於既然laoqi和self是同一個實例對象,直接寫成laoqi.name是否是也能夠呢?segmentfault

#!/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 = "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()

#輸出結果
Author name from laoqi: LaoQi   #laoqi實例輸出結果
Author name from info: LaoQi    #info實例輸出結果

從結果中能夠看出,沒有報錯。可是,info這個實例輸出的結果和laoqi實例輸出的結果同樣。原來,當調用了info實例以後,運行到author(),返回的是laoqi.name。因此,這裏必定要用self實例。在調用不一樣的實例時,self會自動的進行匹配,固然,匹配過程是python完成,仍然不用咱們操心。函數

OK,數據流轉過程,看官是否理解了呢?下面進入方法編寫的環節學習

爲何要用到方法

在類裏面,能夠用def語句來編寫函數,可是,一般這個函數的樣子是這樣的:google

class ClassName:
    def __init__(self,*args):
        ...
    def method(self,*args):     #是一個在類裏面的函數
        ...

在類ClassName裏面,除了前面那個具備初始化功能的構造函數以外,還有一個函數method,這個函數和之前學習過的函數同樣,函數裏面要寫什麼,也沒有特別的規定。可是,這個函數的第一個參數必須是self,或者說,能夠沒有別的參數,可是self是必須寫上而且是第一個。這個self參數的做用前面已經說過了。spa

這樣看來,類裏面的這個函數還有點跟之前函數不一樣的地方。

類裏面的這個函數,咱們就稱之爲方法

之因此用方法,也是用類的緣由,也是用函數的緣由,都是爲了減小代碼的冗餘,提升代碼的重用性,這也是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 = "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")

#運行結果

Author name from laoqi: LaoQi in China
Author name from info: LaoQi in Suzhou

這段代碼中,對author方法增長了一個參數address,當調用這個方法的時候:laoqi.author("China"),要對這個參數賦值,看官特別注意,在類中,這個方法顯示是有兩個參數(self,address),可是在調用的時候,第一個參數是自動將實例laoqi與之對應起來,不須要顯化賦值,能夠理解成是隱含完成的(其實,也能夠將laoqi看作隱藏的主體,偷偷地更self勾搭上了)。

經過上面的講述,看官能夠試試類了。提醒,必定要對類的數據流經過程清晰。

相關文章
相關標籤/搜索