本文主要摘譯自HtDP第五章,并結(jié)合Python語(yǔ)言的實(shí)際情況略作修改。原有語(yǔ)言DrRacket改寫(xiě)為Python。
通常的,編程語(yǔ)言都會(huì)提供基本的預(yù)定義數(shù)據(jù)類(lèi)型,比如整型、浮點(diǎn)型、字符串類(lèi)型等等。但是,當(dāng)用編程來(lái)解決實(shí)際問(wèn)題時(shí),我們往往會(huì)發(fā)現(xiàn)這些很難滿(mǎn)足需求。比如,我們需要建立一個(gè)公司的員工數(shù)據(jù)模型,其中包含姓名,年齡,性別,職務(wù),聯(lián)系手機(jī)等信息。這個(gè)模型包含了五條信息,根本沒(méi)法用語(yǔ)言預(yù)先定義的數(shù)據(jù)類(lèi)型來(lái)表達(dá)。
幸運(yùn)的是,編程語(yǔ)言還提供了自定義數(shù)據(jù)類(lèi)型的方法:面向過(guò)程的語(yǔ)言,如C,可以自定義一個(gè)結(jié)構(gòu)體(Struct);面向?qū)ο蟮恼Z(yǔ)言,如Python可以自定義一個(gè)類(lèi)(Class)。
>>> class Personel_Info(object):
... def __init__(self, name, age, gender, post, cellphone_no):
... self.name = name
... self.age = age
... self.gender = gender
... self.post = post
... self.cellphone_no = cellphone_no
...
實(shí)際上,定義一個(gè)數(shù)據(jù)類(lèi)型的同時(shí),也還定義了三類(lèi)函數(shù):
-
構(gòu)造函數(shù)(constructor),使用這一函數(shù)能夠繼續(xù)構(gòu)造同樣類(lèi)型的數(shù)據(jù)實(shí)例(instance)。例如,李明,29歲,男,經(jīng)理,手機(jī)號(hào)碼:29900123456。
>>> li_ming = Personel_Info('Li Ming', 29, 'Male', 'Manager', 29900123456) >>> li_ming <__main__.Personel_Info object at 0x10e13b990> -
指針函數(shù)(selector),使用這一函數(shù)能夠?qū)?shù)據(jù)實(shí)例的具體某一項(xiàng)執(zhí)行取賦值操作。下例展示了對(duì)
li_ming的name項(xiàng)的取賦值操作。>>> li_ming.name 'Li Ming' >>> li_ming.name='Wang Lili' >>> li_ming.name 'Wang Lili' -
判斷函數(shù)(structure predicate),使用這一函數(shù)能夠判斷某一數(shù)據(jù)是否為所定義的類(lèi)型。Python使用
instance()函數(shù)判斷,數(shù)據(jù)實(shí)例和數(shù)據(jù)類(lèi)型為該函數(shù)的參數(shù)。>>> isinstance(li_ming, Personel_Info) True
編寫(xiě)數(shù)據(jù)類(lèi)型的說(shuō)明
之前的例子有個(gè)小瑕疵:缺乏說(shuō)明。
試想一下,如果數(shù)據(jù)錄入人員不清楚age的類(lèi)型,有可能會(huì)錄入字符串'29',如果再換一個(gè)人,又可能錄入了數(shù)字類(lèi)型29。這些差異會(huì)對(duì)后期數(shù)據(jù)處理造成麻煩:得先判斷是什么類(lèi)型,然后執(zhí)行下一步指令。從而,嚴(yán)重拖累程序效率。
這是本書(shū)推薦的數(shù)據(jù)類(lèi)型說(shuō)明樣例:
class Personel_Info(object):
'''
A Personel_Info is a class: Personel_Info( str, int, str, str, int) # 寫(xiě)出構(gòu)造函數(shù),參數(shù)中注明數(shù)據(jù)類(lèi)型,可以是語(yǔ)言預(yù)定義的類(lèi)型,也可以是之前定義好的自定義類(lèi)型
Interpretation : Represent a person of the company. # 注明該數(shù)據(jù)類(lèi)型所表達(dá)的實(shí)際意義
'''
def __init__(self, name, age, gender, post, cellphone_no):
self.name = name
self.age = age
self.gender = gender
self.post = post
self.cellphone_no = cellphone_no
如有必要,還應(yīng)該在說(shuō)明中舉例:
- 如果是語(yǔ)言的預(yù)定義類(lèi)型,數(shù)字、字符串、布爾值等,可以直接給出自己喜歡的例子;(有些指南會(huì)建議取一個(gè)描述性的名字,然而還是比不上好的數(shù)據(jù)類(lèi)型說(shuō)明)
- 對(duì)于枚舉類(lèi)型,可以從中選擇若干;
- 對(duì)于區(qū)間類(lèi)型,應(yīng)該給出邊際值,如果包含的話,同時(shí)再給出一個(gè)區(qū)間中間值;
- 如果是選擇結(jié)構(gòu)類(lèi)型(類(lèi)似于數(shù)學(xué)中的分類(lèi)函數(shù)),應(yīng)該各自舉例;
- 對(duì)于自定義類(lèi)型,就給出一個(gè)數(shù)據(jù)實(shí)例。