2012-12-03 97 views
2

長時間監聽,第一次調用者。Python:跨模塊和外殼共享對象

我有一個高層次的設計問題,這可能是過於籠統,但這裏有: 目前,我已經寫了一個體面大小的模塊集。我通過編寫調用模塊的長腳本來使用它們。我需要重構,以使其更具互動性;而不是依靠長腳本,想要從shell調用函數和修改對象實例。

問題:需要在所有模塊和shell之間共享對象實例。

當前,只是創建了一個包含對象實例初始化的模塊,其他所有模塊都從該「工作空間」模塊導入了共享實例。我認爲必須有一個更優雅的方式來做到這一點;有什麼建議麼?

P.S.最初,使用了對象方法,但在與一位真正的程序員(我是一個機械人)交談之後,他建議我只使用對象作爲屬性的容器,並分別分解這些方法。

編輯:更改示例代碼以包含多個實例&刪除多餘的文件夾/文件。

注意:對象方法與單獨的方法問題很有趣,但這裏的主要問題是從模塊和shell中訪問實例。


嘗試在一個簡單的概括例如:

(免責聲明:這是廢話代碼,只是想在一般的顯示問題,我試圖解決的類型,即都是由調用方法修改對象實例。並通過直接從殼改變屬性)

===== folder structure ===== 

dev/init.py 
dev/bike.py 
dev/car.py 
dev/workspace.py 

===== init.py ====== 

from workspace import * 
import bike 
import car 

===== workspace.py ===== 

class Bike: 
    pass 

class Car: 
    pass 

b = [Bike(), Bike()] 
c = Car() 

===== bike.py ===== 

from workspace import * 

def start(): 
    b[0].x = 6 
    b[1].x = 9 

def move(): 
    b[0].x += 1 
    b[1].x += 1.2 

def distance(): 
    print(b[0].x-c.x) 

===== car.py ===== 

from workspace import * 

def start(): 
    c.x = 0 

def move(): 
    c.x += 2 

def brake(bike_instance): 
    if bike_instance.x - c.x < 2: 
     c.x = 0 

實例:

$ python init.py -i 
>>> bike.start() 
>>> car.start() 
>>> bike.move() 
>>> car.move() 
>>> car.move() 
>>> car.move() 
>>> bike.distance() 
>>> car.brake(b[0]) 
>>> car.brake(b[1]) 
>>> c.x = 5 
+0

也許這是你可以用鹹菜來解決的問題?即添加一個包裝器/裝飾器,以便在進入一個函數時加載和取消對象,並且在退出時再次清理並再次存儲它?(方法相同) – nvlass

+2

如果我正確理解你的問題,我很好奇:你的程序員朋友對他們的相應類中有相關方法有什麼反對?如果一個函數是一個類方法是有意義的,那麼你絕對應該這樣做。 – Natan

+0

是否有一個原因,你特別只想在那裏有每個模塊中的每個類的單個實例?你從不想要兩輛車? – jdi

回答

0

我不知道您的預期工作流程是什麼,或者您的init.py位於包的根目錄中,但我認爲您的模塊應該分別定義它們的類。然後你會在入口點創建這些類的實例並使用它們。你現在正在做什麼,創建實例是導入的一個副作用,就像一個「Singleton」類型模式。如果你想要2輛自行車或2輛車?

開發/模塊/ car.py

class Car: 
    pass 

開發/模塊/ bike.py

class Bike: 
    pass 

開發/ init.py(或工作區,如我不不知道它是什麼)

from modules import bike, car 

aBike = bike.Bike() 
aCar = car.Car() 
+0

Heya;問題在於如何從汽車內部進入自行車,反之亦然......製造出多個「自行車」或「汽車」。 – daedalus12

+0

他們不應該依賴於對方。這意味着一個循環進口,這不是好的設計。自行車模塊應該定義自行車。汽車模塊定義汽車。您將它們導入腳本以使用它們。 – jdi

+0

看起來「單身」模式,這確實看起來像「workspace.py」模塊。我改變了這個例子來展示我如何適應多個自行車(工作空間定義列表而不是單個實例)。我看到通告進口不好;你會推薦除了每次傳遞實例作爲參數之外的任何東西,即'car.brake(b)'嗎? – daedalus12