python是一種面向對象的語言。面向對象程序設計中的術語對象基本上可以看做數據(特性)以及由一系列可以存取、操作這些數據的方法所組成的集合。使用對象替代全局變量和函數的原因可能有很多,其中對象最重要的優點包括三個方面:
- 多態:可以對不同類的對象使用同樣的操作
- 封裝:對外部世界隱藏對象的工作細節
- 繼承:以普通的類為基礎建立專門的類對象
多態和方法
程序得到了一個對象,不知道它是怎么實現的,它可能有多種"形狀"。
綁定到對象特性上面的函數稱為方法。
>>> 'abc'.count('a') 1 >>> [1,2,'a'].count('a') 1
對應變量x來說,不需要知道它是字符串還是列表,就可以調用它的count方法,不用管它是什么類型
舉例,標准庫random中包含choice函數,可以從序列中隨機選出元素。給變量賦值:
>>> from random import choice >>> x=choice(['Hello,world!',[1,2,'e','e',4]])
運行后,變量x隨機選擇一個值
>>> x.count('e') 1 >>> x 'Hello,world!' >>>
多態的多種形式
任何不知道對象到底是什么類型,但是又要對對象操作時,都會用到多態。
>>> 1+2 3 >>> 'Hello,'+'world' 'Hello,world'
>>> add(1,2) 3 >>> add('Hello,','world') 'Hello,world'
參數可以是任何支持加法的對象。
編寫打印對象長度消息的函數
>>> def length_message(x): print "The length of",repr(x),"is",len(x)
函數中使用了repr函數,repr函數是多態特性的代表之一
>>> length_message('Fnord') The length of 'Fnord' is 5 >>> length_message([1,2,3]) The length of [1, 2, 3] is 3
封裝
封裝是對全局作用域中其他區域隱藏多余信息的原則。不用關心對象是如何構建的而直接進行使用
假設有一個叫做OpenObject的類:
>>> o=OpenObject() >>> o.setName('Sir Lancelot') >>> o.getName() #此案例並不能運行成功,只是假設 'Sir Lancelot'
創建了一個對象后,將變量o綁定到該對象上。可以使用setName和getName方法(假設已經由OpenObject類提供)。
假如變量o將它的名字存儲在全局變量globalName中:
在使用OpenObject類的實例時,不得不關心globalName的內容。
>>> globalName 'Sir Lancelot' >>> globalName='Sir Gumby' >>> o.getName() 'Sir Gumby'
如果創建了多個OpenObject實例會出現問題
>>> o1=OpenObject() >>> o2=OpenObject() >>> o1.setName('Robin Hood') >>> o2.getName() 'Robin Hood'
如果不用全局變量而用特性重寫類,並且重命名為ClosedObject
>>> c=ClosedObject() >>> c.setName('Sir Lancelot') >>> c.getName() 'Sir Lancelot' >>> r=ClosedObject() >>> r.setName('Sir Robin') >>> r.getName() 'Sir Robin >>> c.getName() 'Sir Lancelot'
繼承
如果已經有了一個類,又想建立一個新的類似的類,讓新的類從老的類中繼承方法,新的類增加幾個方法