作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
上一講我們熟悉了對象和類的基本概念。這一講我們將進一步拓展,以便我們真正能實際運用對象和類。
1. 在方法內調用類屬性(變數以及其它方法):
上一講我們已經提到,在定義方法時,必須有self這一參數,這個參數指的是對象。由於對象擁有類的所有性質,那麼我們就可以在方法內部通過self來調用類的其它屬性。
class Human(object): laugh = 'hahahaha' def show_laugh(self): print self.laugh def laugh_100th(self): for i in range(100): self.show_laugh()
li_lei = Human() # 李雷
li_lei.laugh_100th()
我們這裡有一個變數屬性laugh,在方法show_laugh()中通過self.laugh使用該屬性的值。方法show_laugh則在laugh_100th中通過self.show_laugh()被調用。
(通過對象來修改類屬性是危險的,這樣可能會影響根據這個類定義的所有對象的這一屬性!!)
2. __init__()方法
__init__()是一個特殊方法(special method)。Python裡會有一些特殊方法,Python會以特別的方式處理它們。特殊方法的名字的特點是前後都有兩個底線。
__init__()方法的特殊在於,如果你在類中定義了這個方法,一旦你根據這個類建立對象,Python就會自動調用這個方法(這個過程也叫初始化)。(在上一講中,我們手動調用了move()方法)
class happyBird(Bird): def __init__(self,more_words): print 'We are happy birds.',more_words
summer = happyBird('Happy,Happy!')
(Bird類的定義見上一講)
螢幕上列印出:
We are happy birds.Happy,Happy!
我們看到,儘管我們只是建立了summer對象,但__init__()方法被自動調用了。最後一行的語句(summer = happyBird...)先建立了對象,然後執行:
summer.__init__(more_words)
'Happy,Happy!' 被傳遞給了__init__()的參數more_words
3. 對象的性質
上一講我們講了變數屬性和方法屬性。要注意,這些屬性是類的屬性。所有屬於一個類的對象都會共用這些屬性。比如說,鳥都有羽毛,雞都不會飛。
在一些情況下,我們需要用到對象的性質。比如說,人是一個類別,我們知道,性別是人類的一個性質,但並不是所有的人類都是男性或者所有的人類都是女性。這個性質的值會隨著對象的不同而不同。(李雷是人類的一個對象,性別是男;韓美美也是人類的一個對象,性別是女)。
從上一講中,我們已經知道了,當定義類的方法時,必須要傳遞一個self的參數。這個參數指代的就是類的一個對象。當然,這是一個很模糊的一個概念。但一旦我們用類來建立一個對象(比如說我們下面例子中的li_lei), 那麼li_lei就是self所代表的東西。我們已經知道了,li_lei會擁有Human類的屬性。進一步,我們通過賦值給self.attribute,給li_lei這一對象增加一些性質(比如說性別)。由於self強制傳遞給各個方法,方法可以通過引用self.attribute很方便地查詢到這些性質,並進行進一步的操作。
這樣,我們在類的屬性統一的基礎上,又給每個對象增添了各自特色的性質,從而能描述多樣的世界。
class Human(object): def __init__(self, input_gender): self.gender = input_gender def printGender(self): print self.genderli_lei = Human('male') # 這裡,'male'作為參數傳遞給__init__()方法的input_gender變數。
print li_lei.genderli_lei.printGender()
首先,在初始化中,將參數input_gender賦值給對象li_lei的性質gender。(上一講,我們已經提到,self指示的是對象, 也就是li_lei)
我們發現,li_lei擁有了屬性gender。在類human的定義中,並沒有這樣一個變數屬性。Python是在建立了li_lei這一對象之後,專門為li_lei建立的屬性。我們稱此為對象的性質。(也有人以類屬性,對象屬性來區分)。
對象的性質也可以被其它方法調用,正如我們在printGender方法中所看到的那樣。
總結:
通過self調用類屬性
__init__(): 在建立對象時自動執行
類屬性和對象的性質的區別