假設a和b均為類,分別定義在不同的原始檔中,兩者需要頻繁互動,a需向b傳遞多種型別的引數,b處理完成向a反饋結果訊息。這兩者的互動該如何進行?
假設a和b的**如下:
# -*- coding: utf-8 -*-
"""created on thu apr 9 22:19:59 2020
@author: mrn_edi
"""from b import b
class a:
def __init__(self):
self.b = b()
def deliver(self, params):
self.b.handle(params)
# -*- coding: utf-8 -*-
"""created on thu apr 9 22:20:25 2020
@author: mrn_edi
"""class b:
def __init__(self):
pass
def handle(self, params):
self.produce(params)
def produce(self, products):
pass
傳遞復合型別引數,考慮逐個定義傳遞的方式,可以在handle()引數中列舉所需值:
def handle(self, param1, param2, param3, ..., paramn):
self.produce(param1, param2, param3, ..., paramn)
這種方式簡單明瞭。每次需增加新的引數,直接在對應的引數列表遞增即可。
當然如果handle()出現比較頻繁,修改維護顯得很麻煩。這時可以考慮另一種方法:傳遞有序資料。如果引數型別一致,可以考慮陣列類的方式。
def handle(self, params=):
self.produce(params)
def produce(self, params=):
pass
對於「弱型別」,引數型別相互強制可以輕易轉換的也可以使用陣列類。如若不行,還可以考慮「有序」字串類資料--如json, xml。
另外,一種比較簡潔的方式是使用類屬性。
class param:
def __init__(self):
self.param1 = none
self.param2 = none
self.param3 = none
...
class a:
...def deliver(self, param):
self.b.handle(param)
這種情況下,每次修改引數,僅需修改類param的屬性即可,無需反覆修改handle()和produce()的引數列表。維護變得相當簡單高效。類本質是一種「有序」的符合資料型別。
至於a和b反覆互動的問題,是乙個稍微「棘手」的問題。打個比方說,a提交資料至b,b處理資料,反饋結果給a,a再根據結果繼續活動。一開始,考慮使用函式/方法來解決這問題。在b種定義處理結束的函式/方法onfinish()。如:
class b:
...def handle(self, param_set):
self.produce(param_set)
self.onfinish()
...def onfinish(self):
pass
由於b.onfinish()執行的context是b類定義的,根本無法直接反饋給a物件。這似乎是乙個無解的方法。如果在物件導向種,仍僅以面向過程的思維方式來思考問題,是乙個違背歷史潮流的行為。因為b是在a的context下定義的物件,b需要向a反饋訊息,所以要在a的context中定義乙個方法函式並傳遞至b,且由b呼叫執行。
class a:
...def setlistener(self, listener):
self.b.setlistener(listener)
...
class b:
...def setlistener(self, listener):
self.listener = listener
...def handle(self, param_set):
self.produce(param_set)
self.listener.onfinish()
至此a和b的互動過程定義完成。這幾行**雖然看起來很簡單,但在實際應用情況中比較複雜。因為這裡面包含一段**「穿梭」在不同context中。如果onfinish()方法包含一些系統「敏感」資源呼叫,則要考慮應該以何種方式如何呼叫它才不會引起bug甚至程式崩潰。 兩個窗體間實時傳遞資料
相信大家在做系統的時候,很多人都遇到需要在兩個不同的窗體間傳遞資料的情況,例如可以單獨開啟乙個視窗,用於顯示 名稱對照關係,通過雙擊該窗體的資料,我們希望這個資料傳遞到另乙個窗體中。如何實現兩個窗體間資料的實時傳遞呢?其實很簡單,只需要簡單地運用事件通知就可以了。首先做如下假設 有兩個窗體mainf...
如何在兩個Google 帳號間搬移雲端硬碟資料?
google drive 是很多人依賴的雲端空間,甚至會多開乙個帳號來使用,如果要在兩個帳號間移動google drive 的資料該怎麼做?尤其是這兩天的新聞說google 要收回教育帳號的無上限容量服務,相信很多人要開始把檔案從教育帳號中搬出來了。以下的方法中,原本擁有檔案的google 帳號暫且...
如何在兩個Google 帳號間搬移雲端硬碟資料?
google drive 是很多人依賴的雲端空間,甚至會多開乙個帳號來使用,如果要在兩個帳號間移動google drive 的資料該怎麼做?尤其是這兩天的新聞說google 要收回教育帳號的無上限容量服務,相信很多人要開始把檔案從教育帳號中搬出來了。以下的方法中,原本擁有檔案的google 帳號暫且...