python 類的細節(jié)

下面我根據(jù)MARK Lutz的《Learning Python》中的“大師眼中的OOP”,列一些使用OOP的常見原因辫继。

  • 代碼重用腊状。這是很簡單(并且是使用OOP的最主要原因)酱吝。通過支持繼承纳本,類允許通過定制來編程,而不是每次都從頭開始一個項目腋颠。
  • 封裝繁成。在對象接口后包裝其實現(xiàn)的細節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響淑玫。
  • 結(jié)構(gòu)巾腕。類提供了一個新的本地作用域,最小化了變量名沖突絮蒿。他們還提供了一種編寫和查找實現(xiàn)代碼尊搬,以及去管理對象狀態(tài)的自然場所。
  • 維護性土涝。類自然而然地促進了代碼的分解佛寿,這讓我們減少了冗余。對虧支持類的結(jié)構(gòu)以及代碼重用但壮,這樣每次只需要修改代碼中一個拷貝就可以了冀泻。
  • 一致性。類和繼承可以實現(xiàn)通用的接口蜡饵。這樣代碼不僅有了統(tǒng)一的外表和觀感弹渔,還簡化了代碼的調(diào)試、理解以及維護溯祸。
  • 多態(tài)肢专。多態(tài)讓代碼更靈活和有了廣泛的適用性舞肆。(這似乎是OOP的屬性,不是使用它的理由)

此外博杖,對于python2來說椿胯,還有一個叫做“新式類”(new-style)的東西,這個對應(yīng)于前面講過的類欧募,那么前面講過的類就稱為“經(jīng)典”(classic)類压状。但是,對于Python3來講跟继,沒有這種區(qū)別种冬,二者融合。只是在Python2中舔糖,兩個是有區(qū)別的娱两。在基礎(chǔ)部分,依然不講授新式類的問題金吗,如果有興趣十兢,可以自己在GOOGLE中查找有關(guān)資料,也可以隨著我博客的深入摇庙,到下一個階段來學習旱物。

綁定和無綁定方法

類的方法就是函數(shù),只不過這個函數(shù)的表現(xiàn)有點跟前面學過的函數(shù)不一樣卫袒,比如有個self宵呛。當然,也不是必須要有的夕凝,下面就會看到?jīng)]有self的宝穗。既然方法和函數(shù)一樣,本質(zhì)上都是函數(shù)码秉,那么逮矛,函數(shù)那部分學習的時候已經(jīng)明確了:函數(shù)是對象,所以转砖,類方法也是對象须鼎。正如剛才說的,類的方法中府蔗,有的可以有self莉兰,有的可以沒有。為了進行區(qū)別礁竞,進一步做了這樣的定義:

  • 無綁定類方法對象:無self
  • 綁定實例方法對象:有self

調(diào)用綁定實例方法對象

>>> class MyClass:
...     def foo(self,text):
...         print text
... 

可以用下面的方式調(diào)用實例方法

>>> a = MyClass()       #創(chuàng)建類實例
>>> a.foo('hiekay.github.io')       #調(diào)用實例方法
hiekay.github.io
>>> a.foo
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>

在這個實例方法調(diào)用的時候糖荒,其實已經(jīng)將實例名稱a傳給了self,這就是調(diào)用綁定實例方法對象模捂,有self捶朵。

上面的調(diào)用過程蜘矢,還可以這樣來實現(xiàn):

>>> a = MyClass()
>>> x = a.foo       #把實例a和方法函數(shù)foo綁定在一起
>>> x
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>
>>> x("hiekay.github.io")
hiekay.github.io

在上面的調(diào)用中,其實相當于前面的調(diào)用過程的分解動作综看。即先將實例a和方法函數(shù)foo綁定在一起品腹,然后賦值給x,這時候x就相當于一個簡單函數(shù)一樣红碑,可以通過上述方式傳入?yún)?shù)舞吭。這里將實例和方法函數(shù)綁定的方式就是運用點號運算(object.method_function)

調(diào)用無綁定類方法對象

所謂類方法對象,就是不通過實例析珊,而是用類進行點號運算來獲得方法函數(shù)(ClassName.method_function)

>>> a = MyClass()
>>> y = MyClass.foo     #這里沒有用類調(diào)用
>>> y
<unbound method MyClass.foo>

這樣的調(diào)用羡鸥,就得到了無綁定方法對象,但是忠寻,調(diào)用的時候必須傳入實例做為第一參數(shù)惧浴,如下

>>> y(a,"hiekay.github.io")
hiekay.github.io

否則,就報錯奕剃。請看官特別注意報錯信息

>>> y("hiekay.github.io")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead)
>>> 

在編程實踐中衷旅,似乎用實例方法調(diào)用更多一下。

文檔字符串

在寫程序的時候纵朋,必須要寫必要的文字說明柿顶,沒別的原因,除非你的代碼寫的非常容易理解操软,特別是各種變量嘁锯、函數(shù)和類等的命名任何人都能夠很容易理解,否則寺鸥,文字說明是不可缺少的。

在函數(shù)、類或者文件開頭的部分寫文檔字符串說明,一般采用三重引號倦淀。這樣寫的最大好處是能夠用help()函數(shù)看衩藤。

"""This is python lesson"""

def start_func(arg):
    """This is a function."""
    pass

class MyClass:
    """Thi is my class."""
    def my_method(self,arg):
        """This is my method."""
        pass

這樣的文檔是必須的。

當然蜈漓,在編程中,有不少地方要用“#”符號來做注釋。一般用這個來注釋局部凉驻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市复罐,隨后出現(xiàn)的幾起案子涝登,更是在濱河造成了極大的恐慌,老刑警劉巖效诅,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胀滚,死亡現(xiàn)場離奇詭異趟济,居然都是意外死亡,警方通過查閱死者的電腦和手機咽笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門顷编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剑刑,你說我怎么就攤上這事媳纬。” “怎么了施掏?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵钮惠,是天一觀的道長。 經(jīng)常有香客問我其监,道長萌腿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任抖苦,我火速辦了婚禮毁菱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌历。我一直安慰自己贮庞,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布究西。 她就那樣靜靜地躺著窗慎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卤材。 梳的紋絲不亂的頭發(fā)上遮斥,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音扇丛,去河邊找鬼术吗。 笑死,一個胖子當著我的面吹牛帆精,可吹牛的內(nèi)容都是我干的较屿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼卓练,長吁一口氣:“原來是場噩夢啊……” “哼隘蝎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起襟企,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘱么,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后顽悼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拱撵,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡辉川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴测。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓旗。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖集索,靈堂內(nèi)的尸體忽然破棺而出屿愚,到底是詐尸還是另有隱情,我是刑警寧澤务荆,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布妆距,位于F島的核電站,受9級特大地震影響函匕,放射性物質(zhì)發(fā)生泄漏娱据。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一盅惜、第九天 我趴在偏房一處隱蔽的房頂上張望中剩。 院中可真熱鬧,春花似錦抒寂、人聲如沸结啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郊愧。三九已至,卻和暖如春井佑,著一層夾襖步出監(jiān)牢的瞬間属铁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工躬翁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焦蘑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓姆另,卻偏偏與公主長得像喇肋,于是被迫代替她去往敵國和親坟乾。 傳聞我的和親對象是個殘疾皇子迹辐,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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

  • 包(lib)、模塊(module) 在Python中甚侣,存在包和模塊兩個常見概念明吩。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,808評論 0 27
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章殷费,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,767評論 2 9
  • 現(xiàn)在那么多印荔,各種各樣的理財產(chǎn)品低葫。你想選擇一個好的理財,可以帶你賺錢仍律,或者帶你了解:傩!水泉!不論做什么都是要謹慎的I普恰!草则!
    潘小娟閱讀 154評論 0 0
  • 不同的人對事物的理解不一樣钢拧,一萬個人聽同一首歌,就會有一萬種情感炕横≡茨冢總有一首歌,歌詞很美份殿,卻會讓人心痛膜钓。那些很美的歌...
    茶七故事閱讀 180評論 0 0