Python 介面 – 首先 Python 是沒有介面的 (Interface 這 Keyword), 但其概念還可以類型實作.
運用介面的好處
- 把相以的Class, 借建立框架, 既使內裏Logic不同, 也可以統一輸出的Method, 一方面令使用者容易記得, 一方法令使用者容易調用. 例如Machine Learning裏, 用Algorithm用想到, fit, predict等Method
- 加上Looping, 可使編程更快. 例如如果想試不同的Alorgithm, 可以先把Alorgithm的Params放進List內, 用for 一個個起試.
- 在工作實務中, 不同的System, Database, Rest API, Datatable,Class都可能會不同。統一介面, 可以使多個受方容易用, 即使日後供應方的Logic變了, 也因介面相同, 而不會對受方有影响.
運用介面的好處
- 把相以的Class, 借建立框架, 既使內裏Logic不同, 也可以統一輸出的Method, 一方面令使用者容易記得, 一方法令使用者容易調用. 例如Machine Learning裏, 用Algorithm用想到, fit, predict等Method
- 加上Looping, 可使編程更快. 例如如果想試不同的Alorgithm, 可以先把Alorgithm的Params放進List內, 用for 一個個起試.
- 在工作實務中, 不同的System, Database, Rest API, Datatable,Class都可能會不同。統一介面, 可以使多個受方容易用, 即使日後供應方的Logic變了, 也因介面相同, 而不會對受方有影响.
以下會舉一個簡單的生活例子 (Inherit 繼承), 及一個工作上的例子 (Interface 介面), 以供各位參考:
Interface: |
class AccountList: def Calculation(): pass; def LoadItemsFromDB(): pass; |
Implements Class: |
class PurchasingList(AccountList): def __init__(self): self.items = []; def LoadItemsFromDB(self): # ****** def Calculation(self): amount = 0; amount -= self.CalOrderCost(); amount -= self.CalOrderDeliveryCost(); return amount; def CalOrderCost(self): # ****** def CalOrderDeliveryCost(self): # ****** |
Implements Class: |
class InventoryList(AccountList): def __init__(self): self.items = []; def LoadItemsFromDB(self): # ****** def Calculation(self): amount = 0; amount -= self.CalOrderInventoryFees(); amount -= self.CalOrderMaintanceFees(); return amount; def CalOrderInventoryFees(self): # ****** def CalOrderMaintanceFees(self): # ****** |
Implements Class: |
class SellingList(AccountList): def __init__(self): self.items = []; def LoadItemsFromDB(self): #******* def Calculation(self): amount -= self.CalOrderCost(); amount += self.CalSellingGain(); amount -= self.CalOrderDeliveryCost(); return amount; def CalSellingGain(self): #******* def CalSellingCost(self): #******* def CalOrderDeliveryCost(self): #******* |
Abstract Class Master: |
accountLists = [PurchasingList(),InventoryList(),SellingList()]; for item in accountLists: item.LoadItemsFromDB(); sum = 0; for item in accountLists: sum += item.Calculation(); print(“Sum: ” + str(sum)); |
注意事項 |
1) ExpenitureReport.Run 是入口首先把幾個 PurchasingList, SellingList, ExpenitureReport 的Instance放入List<AccountList>內 2) 用foreach 運行LoadItemsFromDB得到Data 3) 用foreach 運行Calculation得到總金頧Sum |
Interface (類型仿作): |
class ImageFilter: def Process(self): pass; def LoadPixels(self): pass; |
Implements Class: |
class Blur(ImageFilter): def FindPixelAverage(self): #************* def FindNeignbour(self): #************* def Process(self): self.FindPixelAverage(); self.FindNeignbour(); def LoadPixels(self): #************* |
Implements Class: |
class Sharpen( ImageFilter): def GetEdge(self): #************* def Blacken (self): #************* def Process (self): self.GetEdge(); self.Blacken(); def LoadPixels(self): #************* |
Abstract Class Master: |
def SetPixels(filters): #************* filters = [Blur(), Sharpen()]; for filter in filters: filter.LoadPixels(); filter.Process(); SetPixels(filters); |
注意事項 |
1) ImageProcesser.Run 是入口首先把幾個 Blur, Sharpen 的 Instance 放入 List<ImageFilter>內 2) 用 foreach 運行 LoadPixel 把Pixel放入Filter 3) 用foreach 運行 Process 得到 計算 4) 最後SetPixels to Image. |
Python類別 – Class, Method, Inheritance, Interface的基礎用法
Python 繼承 的基本用法 – 加入 for loop, if, Array, Collection的例子
參考網頁: https://docs.python.org/3/tutorial/classes.html#inheritance