2012-10-23 122 views
1

我是新來的蟒蛇,我在谷歌上搜索和閱讀SO這一點。蟒蛇圓形進口和訪問類

pin.py:

from board import Board 
class pin(object): 
    board_id = Int() 
    my_board = store.get(Board, board_id) 

    def __init__(self, val): 
    ... 

board.py:

from pin import Pin 
class Board(object): 
    id = Int() 
    def __init__(self, val): 
    ... 

Board.pins = ReferenceSet(Board.id, Pin.board_id) 

正如你可以看到我需要能夠從另一個訪問這兩個引腳和董事會類。只見here只做import pinimport board。但是,當我這樣做,然後我例如在我的pin.py做board.Boardpin.Pin我會my_board = store.get(board.Board, board_id)它給了我這個錯誤

AttributeError: 'module' object has no attribute 'Board'

當我有上面的代碼這沒有發生,但只是沒有通告。

爲了澄清我的問題:

我怎麼做一個圓形的進口,並呼籲從文件中的類被導入?

+0

什麼是你的問題? – BrenBarn

+0

我的問題是我如何做一個循環導入,並從當前文件調用另一個類,所以store.get(board.Board,board_id)不適用於我,因爲該板是要導入的文件並且董事會在該文件我想打電話給 – Matilda

回答

2

真正回答你的問題是「不使用圓形進口」。把兩個模塊需要的東西放到第三個模塊中,或者將兩個模塊組合成一個模塊。

爲了更具體地瞭解您的案例與您鏈接的示例之間發生了什麼:您無法在循環導入 - 其他模塊的頂級模塊代碼中安全地使用循環導入引用。正如你已經解釋過的其他問題一樣,你必須通過訪問函數內部的模塊內容來「保護」循環引用。如果您嘗試直接使用每個模塊從其他的,因爲你正在做的,它永遠不會工作,因爲無論模塊可以完成運行它會嘗試使用其他人之前,這樣既不模塊將永遠去完成運行。

+0

因此,通常意義沒有做到這一點的班,但在這種情況下,我做了一個一對多的關係,這兩個類(型號)需要能夠互相訪問,那麼創建另一個模塊來將普通方法放在那裏是沒有意義的......任何建議? – Matilda

+1

@Meena:爲什麼兩個單獨的模塊在第一個地方? – BrenBarn

+0

嗯所以我來自紅寶石背景,不知道它是如何蟒蛇。但是用ORM activeRecord的方式來思考它。我有一個Pin模型(db中的表格)和一個Board模型(db中的表格),所以他們需要有與表格相對應的獨立類。所以我把它們放在單獨的文件中...模塊是指類還是文件?你的意思是我應該在同一個文件中放兩個班嗎?但是如果存在大量的一對多和多對多的關係,那麼我們最終會得到一個充滿類的大文件。這是如何在python中完成的? – Matilda