如何在兩個頁面間傳遞復合型別引數

2021-10-04 21:32:23 字數 2448 閱讀 1877

假設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 帳號暫且...