面向對象程式設計
類是對象的定義,執行個體是“真正的實物”,
建立一個類
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