【问题标题】:python circular import and accessing classpython循环导入和访问类
【发布时间】:2012-10-13 20:31:34
【问题描述】:

我是 python 新手,为此我正在谷歌搜索和阅读 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)

如您所见,我需要能够从其他类访问 Pin 和 Board。我看到here 只做import pinimport board。但是当我这样做,然后我在我的 pin.py 中执行 board.Boardpin.Pin 时,我会有 my_board = store.get(board.Board, board_id) 它给了我这个错误

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

当我有上面的代码时没有发生这种情况,只是没有循环导入。

澄清我的问题:

如何进行循环导入并从正在导入的文件中调用类?

【问题讨论】:

  • 我的问题是如何进行循环导入并从当前文件调用另一个类,因此 store.get(board.Board, board_id) 对我不起作用,因为该板是要导入的文件,Board 是我要调用的文件中的类

标签: python import dependencies circular-dependency


【解决方案1】:

您问题的真正答案是“不要使用循环导入”。将两个模块都需要的东西放在第三个模块中,或者将两个模块合二为一。

更具体地说明您的案例与您链接的示例的情况:您不能在循环导入彼此模块的顶级模块代码中安全地使用循环导入引用。正如您链接到的另一个问题已经解释的那样,您必须通过仅访问函数内部的模块内容来“保护”循环引用。如果您尝试直接从另一个模块使用每个模块,就像您正在做的那样,它将永远无法工作,因为在尝试使用另一个模块之前,两个模块都无法完成运行,因此两个模块都不会永远完成运行。

【讨论】:

  • 所以不这样做通常是有意义的,但在这种情况下,我正在做一对多的关系,所以两个类(模型)都需要能够相互访问,有点创建另一个模块只是将常用方法放在那里没有意义......有什么建议吗?
  • @Meena:为什么这两个类首先在不同的模块中?
  • 嗯,所以我来自 Ruby 背景,不知道 python 是如何做到的。但是以 ORM activeRecord 的方式考虑它。我有一个 Pin 模型(db 中的表)和一个 Board 模型(db 中的表),所以他们需要有自己的与表相对应的单独的类。所以我把它们放在单独的文件中......模块是指类还是文件?你的意思是我应该把两个类放在同一个文件中吗?但是如果有一大堆一对多和多对多的关系,我们最终会得到一个充满类的大文件。在python中是这样完成的吗?
  • @Meena:模块就是文件。与其他一些语言不同,在 Python 中没有真正的理由将每个类放在自己的文件中。请注意,另一种可能性是将引用另一个类的代码包装在方法中。然后,您可以成功定义类,然后稍后调用该方法来建立关系。您的代码引起问题的唯一原因是循环引用直接在类主体中,而不是在函数/方法中。
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2019-05-13
相关资源
最近更新 更多