跳到主要內容

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繼承

留言

這個網誌中的熱門文章

asp.net core 整合 bootstrap 第三方套件 AdminLTE

過去開發asp.net、asp.net mvc,曾經透過layout 或是 masterpage 設定bootstrap的RWD 模板,並且調用其他非官方的plugin 進行開發測試 同樣 asp.net core 的開發上,將來也會有相同的需求,因此也是透過之前使用的AdminLTE進行開發,這在官網也有最新版本的範本demo https://adminlte.io/themes/dev/AdminLTE/index.html 一、下載AdminLTE 筆者在開發上,所使用的是如圖中這兩個版本 二、建立Asp.Net Core 專案 首先透過命令列,在專案資料夾建立一個Asp.Net Core的MVC專案 D:\ASpNetCoreMvc1\dotnet new mvc 三、Asp.Net Core 檔案配置 接著依據AdminLTE-master 的架構,進行靜態檔案的配置 在asp.net core 的靜態檔案架構上,跟過去在asp.net 的方法也有很大的變革,這個必須配置在wwwroot的資料夾,所以筆者將套件包的檔案下載後,直接複製到 wwwroot 進行設定 內部有些檔案是我自己另外寫的,但大致結構仍以RWD為主的配置。另外如果靜態檔案未配置於wwwroot資料夾,網頁執行後將無法執行css及js 四、進行Layout檔案配置更新 回歸到版面配置重點,在 _Layout 的靜態檔案版面配置方式,其實與asp.net 沒有太大的改變 @RenderBody() 這裡是版面內要處理的部份 五、執行網頁

大社老街屋巡禮

  這座三合院的馬背雕飾蠻細工的 上面兩幢的側牆馬背,都有特別的雕飾,這是常見的三合院風格 在我走回程往我家的方向,又看到幾座大院,後頭都是現代化的樓房 這座三合院蠻有規模的,院子邊還有一座古井,也很有歷史了 這是舊三合院的側屋殘壁,屋頂損壞後就沒再修護了 三合院的側牆 走到了三奶里,這邊就有三座古厝 大社最有名的巫家老厝,老厝是在大社的市中心,黃昏市場外面 老厝的院子保存的很完整 大院的右側一角 老厝的左側小旁門 巫家老厝外院 這座古厝在大社三奶里也蠻有名的 大瓦厝的側邊外牆 房子外牆很典雅,搭配裡面有層次的老建物 房子後頭的一塊小田地,有點像我以前屏東阿嬤家的古厝風格 這個景色很像油畫上面看到的,這區塊的古厝週邊都蓋滿了樓房 走到了大社觀音里後可以看到密集的巷弄老房 巷底的老房子,窗戶上緣有雕花裝飾 老三合院的正廳 巷弄邊老房子一角 在街上看到老房子常常有這個廣告 老巷弄與老房,搭配著新跑車 觀音里的老巷弄三合院

週末假日吃個美食簡單生活、到附近廟宇特寫

這些都是7/25用餐的時候,拍下來的水生植物,這張的應該是布袋蓮 這是鄰居家外面一棵果樹所開的果實 這是保安宮金爐上的李鐵拐 這是住家附近的保安宮,是供奉媽祖的一座宮廟,廟宇的屋瓦彩繪相當緊湊 這是萬善堂金爐上的李鐵拐,住家附近大廟的金爐,都有李鐵拐的像 這間是在住家陽台遠眺可以看到的住宅,很符合目前的設計風格 7/25的中午和老婆去萬丹的香榭簡餐店吃午餐,這是第二次來這裡用餐 這是主餐附的湯 這是主餐,香煎雞腿肉 這是主餐附的小菜 這也是主餐附的小菜 這焗烤是老婆點的,我吃一口還蠻美味的 餐廳的環境蠻舒適的 餐廳外面的水生植物栽植