2012-10-23 83 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