跳到主要內容

Python 類別擴充方法


最近在使用Python 的集合物件進行資料處理, 過程中發現某些時候,需要另外撰寫方法取得特定資料,例如

def fill_tag_data():
    for i in range(0, 999):
        tag = {}
        tag["TagNo"] = '5'+'{0:0>3}'.format(i)
        tag["TagName"] = '5'+'{0:0>3}'.format(i)
        TagData.append(tag)



TagData = [] #定義為list集合


def first_element(pList):
    if len(pList) > 0:
        return pList[0]
    else:
        return {"TagNo": "5000", "TagName": "5000"}
其中 first_element是定義用來取得list的第一筆記錄的方法,需透過
first_data = first_element(TagData) 進行操作,當然也可以透過TagData[0],得到第一筆記錄

但美中不足的是,我們必須確定TagData這個list的長度大於0,才能夠取得TagData[0]
因此在取回TagData[0]以前,會另外撰寫判別式
if(len(TagData)>0):  
   none

於是我在這裡另外建立一個ListPackage類別,並且繼承list

class ListPackage(list):

   
def __str__(self):
       
return "this is new list obj"

這邊建立ListPackage(list)的原因稍後做說明。

回到TagData,原先是TagData = [],必須修改成 TagData = ListPackage(),並非原本的list
而在
def first_element(pList):
這裡也重新定義成新的方法
def first_element(self):

    if len(self) == 0:

        self.append({"TagNo": "5000", "TagName": "5000Name"})

        print(self)

    return self[0]
這裡的first_element可以提供 ListPackage 類別定義為延伸方法:

ListPackage.first_element = first_element

之後TagData若要取得TagData[0]list的第一個位置,可以修改成 TagData.first_element()

Ex:

print(TagData.first_element())

#{‘TagName’: ‘5000’, ‘TagNo’: ‘5000Name’}

這就是python延伸方法的使用方式

另外,這個範例無法使用 list.first_element =first_element(),由於python list屬於內建的原生資料結構,這在執行時會發生can't set attributes of built-in/extension type 'list'  的例外狀況,所以需要另外先建立 ListPackage類別,進行list繼承

留言

這個網誌中的熱門文章

右昌的古厝、老街坊

好久沒在家附近散步,順便拍些附近的街景

位在大社中華路的黃家古厝,這是大社的古蹟之一 這是觀音里的設區協會 有彩繪的外牆 老街巷弄的老屋 在大社的舊巷弄還是可以看到這些老屋 巷弄裡的三合院建築群 這座三合院主體保留的很完整 在院子一角,發現這座古董,這個是石磨,以前農村裡面常常可以看到 中華路旁邊有一處小公園 這是在中華路上一處蠻顯眼的三合大院 除了三合院,也有許多傳統的二層樓房 這座三合院外牆還有一面屏風  

初秋的芒草海 2017年版