天天看點

python 學習之 --面向對象程式設計

面向對象程式設計

類是對象的定義,執行個體是“真正的實物”,

建立一個類

class MyNewObjectType(bases):
    'define MyNewObjectType class'
    class_suite
           

根據上面,關鍵字是class 緊接着就是一個類名。随後是定義類的代碼,這裡通常是各種各樣的定義和申明組成。

object 是所有“類之母”,如果定義的類沒有繼承人和其他父類,object将作為預設的父類。他位于所有類繼承結構的最上層。

方法

類的功能有個通俗的說法叫做方法。方法也就是我們常常在類中定義的函數,隻能被執行個體化後調用。調用一個方法的途徑:1.定義類(和聲明方法) 2. 建立一個執行個體 3.最後一步就是執行個體化後調用方法了

例如

class MyDataWithMethod(object): #定義類
    def printFoo(self):            #聲明一個方法,這裡是用函數定義的了吧?
        print 'you invoked printFoo()'
           

這裡的 self 參數迷惑我很久了,當時沒有認真看書,現在好好做筆記。這是筆記自然有個人的想法和經曆。這裡的self就是一個預設值。當然,你也可以用其他的,不過大家都用self看着自然大家都明白。不然時間久了,我們自己看代碼都迷惑了

那麼下面我們來調用這個方法了

myObj = MyDataWithMethod()        #建立執行個體
myObj.printFoo()                #調用方法
you invoked printFoo()            #列印出的結果
           

在過去,一直被一個東西困擾__init_()當時基本上看到源碼都有這個東西,困擾了。很迷茫。沒看書,也不知道該怎麼看。好吧,後來在書上找到了答案

__init__() 就是一種特殊的方法,類似于構造器,在建立一個新的對象時候被調用。而在python中,它不是一個構造器,因為python沒有“new”這樣的關鍵字。python在建立執行個體後,在執行個體化過程中,調用 __init__() 方法,當一個類被執行個體化時,就可以定義額外的行為,比如,設定初始值或者運作一些初步診斷代碼————主要是在執行個體被建立後,執行個體化調用傳回這個執行個體之前,去執行某些特定的任務或設定

用一個例子來說明:

class AddrBookEntry(object):            #類的定義
    'address book entry class'
    def __init__(self, nm, ph):            #定義構造器
        self.name = nm                     #設定 name
        self.phone = ph                 #設定 phone值
        print 'Created instance for: ', self.name
    def updatePhone(self, newph):        #定義方法
        self.phone = newph
        print 'Updated phone# for: ', self.name
           

建立執行個體 (執行個體化)

joe = AddrBookEntry('JOE','02026211623')
joe = AddrBookEntry('JOE','03026211623')
           

執行個體化調用,會自動調用 __init__() 。self 把執行個體對象自動傳入 __init__()。你可以在腦子裡把方法中的 self 用執行個體名替換掉。在上面第一個例子中,當對象joe被執行個體化後,joe.name 就被設定了

如果不存在預設的參數,那麼傳給 __init__() 的兩個參數在執行個體化時是必須的

通路屬性

現在來通路joe的兩個屬性分别為 name 和phone

>>> joe.name
'joe is '
>>> joe.phone
'03026211623'
           

方法的調用 (通過執行個體)

joe.updatePhone('03026211623')

下面是在IDLE下面的指令和列印出的值

>>> joe.updatePhone('04026211623')
Updated phone# for:  JOE
           

現在來通路joe的phone 屬性了

>>> joe.phone
'04026211623'
           

說明已經更新成功

類的繼承:建立子類

靠繼承來進行子類話是建立和制定新類類型的一種方式,新的類将已存在類所有的特性,而不會改動原來類的定義。對于子類來說,他繼承了父類的屬性,子類也可以定制屬于自己的特定功能

下面來執行個體進行說明

class EmplADDrBookEntry(AddrBookEntry):
    'Employee Address Book Entry class' #員工位址
    def __init__(self, nm, ph, id, em):
        AddrBookEntry.__init__(self,nm, ph)
        self.empid = id
        self.email = em
    def updateEmail(self, newem):
        self.email = newem
        print 'Update e-mail address for: ', self.name
           

上面我們建立了一個子類, EmplADDrBookEntry,它繼承了父類 AddrBookEntry 中繼承了updatePhone()的方法,當然我們也給它定義了 __init__(),updateEmail()方法

如果不定義子類自己的構造器,它會調用基類也就是父類的構造器

現在子類擁有了下面四個屬性: 員工id,電子郵件,當然還有父類的電話号碼和名字

下面來使用子類

>>> joe = EmplADDrBookEntry('joe',05082153587,22,'[email protected]')
SyntaxError: invalid token
>>> joe = EmplADDrBookEntry('joe',5082153587,22,'[email protected]')
Created instance for:  joe
>>> joe = EmplADDrBookEntry('joe','05082153587',22,'[email protected]')
Created instance for:  joe
>>>
           

上面出現問題了,這裡應該好好體會一下,不是0開頭的數字就可以,如果以0開頭的數字就成了字元串?

下面分别來通路屬性

>>> joe
<__main__.EmplADDrBookEntry object at 0x01D2C510>
>>> joe.name
'joe'
>>> joe.phone
'05082153587'
>>> joe.email
'[email protected]'
>>> joe.updatePhone
<bound method EmplADDrBookEntry.updatePhone of <__main__.EmplADDrBookEntry object at 0x01D2C510>>
>>> joe.updatePhone('[email protected]')
Updated phone# for:  joe
>>> joe.email
'[email protected]'
下面我們來更新屬性
>>> joe.updateEmail('[email protected]')
Update e-mail address for:  joe
>>> joe.email
'[email protected]'
           

類是一種資料結構,我們可以用它來定義對象,類是現實世界的抽象的實體以程式設計形式出現。執行個體是這些對象的具體化。

def functionName(args):
    'function documentation string'        #函數文檔字元串
    function_suite                        #函數體
class ClassName(object):
    'class documentation string'        #類文檔字元串
    class_suite
           

                    #類體

類的屬性

屬性就是屬于另一個對象資料或者函數元素,可以哦那個個我們熟悉的句點屬性辨別法來通路。

類的資料屬性,資料屬性僅僅用來定義類的變量。

類的資料屬性執行個體

class a(object):
    foo = 100
print a.foo
100
a.foo = a.foo +1
101
           

類的方法

類的方法僅僅是作為類定義一部分定義的函數。

>>> class MyClass(object):
    def myNoActonMethod():
        pass
>>> m = MyClass()
>>> m.myNoActonMethod()
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    m.myNoActonMethod()
TypeError: myNoActonMethod() takes no arguments (1 given)
>>>
           

這裡調用自身,是以失敗了

執行個體化

如果說類是一種資料結構定義類型,那麼執行個體則是聲明一個這種類型的變量。類被執行個體化後得到執行個體。

==========================待續======================================

轉載于:https://blog.51cto.com/anqyunwei/1405098