如何自定義數(shù)據(jù)類(lèi)型

本文主要摘譯自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_mingname項(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ō)明中舉例:

  1. 如果是語(yǔ)言的預(yù)定義類(lèi)型,數(shù)字、字符串、布爾值等,可以直接給出自己喜歡的例子;(有些指南會(huì)建議取一個(gè)描述性的名字,然而還是比不上好的數(shù)據(jù)類(lèi)型說(shuō)明)
  2. 對(duì)于枚舉類(lèi)型,可以從中選擇若干;
  3. 對(duì)于區(qū)間類(lèi)型,應(yīng)該給出邊際值,如果包含的話,同時(shí)再給出一個(gè)區(qū)間中間值;
  4. 如果是選擇結(jié)構(gòu)類(lèi)型(類(lèi)似于數(shù)學(xué)中的分類(lèi)函數(shù)),應(yīng)該各自舉例;
  5. 對(duì)于自定義類(lèi)型,就給出一個(gè)數(shù)據(jù)實(shí)例。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容