Python 3.4 - 来自另一个模块的类在用作模块级变量或类级变量时会导致错误



在Python 3.4(我的操作系统是Ubuntu/Linux 14.04)中,我有一个包含许多模块的软件包。其中一些模块相互依赖(模块 A 使用模块 B 中的对象,模块 B 使用模块 A 中的对象)。我能够通过将import Package.A放在模块 B 的顶部和模块 A 的顶部import Package.B来管理循环导入。 从另一个模块对类的模块内调用是通过使用类的完整包路径(例如 x = Package.A.SomeClass() 执行的。

我在以下两种情况下遇到问题:

情况 1:从模块 B 调用模块 A 中的类以定义模块 B 中的模块级变量时。

情况 2:从模块 B 调用模块 A 中的类以定义模块 B 中的类级变量时。

我想了解为什么在某些情况下Package.A.SomeClass()有效,而在其他情况下则无效。

我在下面复制了一个非常简化的代码版本(我的真实代码可以包含来自 3 或 4 个模块的依赖项)。

我的软件包结构:

/home/phodor/test.py
/home/phodor/MInventory
/home/phodor/MInventory/__init__.py (empty file)
/home/phodor/MInventory/MProducts.py
/home/phodor/MInventory/MStores.py

一般情况:以下效果很好

/

home/phodor/minventory/MProducts.py

import MInventory.MStores
class MRobot():
   def __init__(self):   
      self.Price = 0
      self.Weight = 0
/

home/phodor/minventory/MStores.py

import MInventory.MProducts
class MCommercialCenterStore():    
   def __init__(self):       
      self.Name = ""
      self.CommercialCenter = ""
      self.Products = []
      self.MostSoldProduct = MInventory.MProducts.MRobot()
/

home/phodor/test.py

import sys
sys.path.append("/home/phodor/")
from MInventory.MProducts import *
from MInventory.MStores import *
oStore = MCommercialCenterStore()
oStore.Name = "Main Street SuperCenter"
print(oStore.Name)
print(oStore.MostSoldProduct)   
情况

1:以下情况会产生错误。

/

home/phodor/minventory/MStores.py

import MInventory.MProducts
CustomersChoice = MInventory.MProducts.MRobot
class MCommercialCenterStore():    
    def __init__(self):       
        self.Name = ""
        self.CommercialCenter = ""
        self.Products = []
        self.MostSoldProduct = CustomersChoice

错误:

CustomersChoice = MInventory.MProducts.MRobot
AttributeError: 'module' object has no attribute 'MProducts'

情况 2:以下还会产生错误。

/

home/phodor/minventory/MStores.py

class MCommercialCenterStore():
   MostSoldProduct = MInventory.MProducts.MRobot
   def __init__(self):   
      self.Name = ""
      self.CommercialCenter = ""
      self.Products = []

错误:

MostSoldProduct = MInventory.MProducts.MRobot
AttributeError: 'module' object has no attribute 'MProducts'

循环依赖关系信息

如前所述,我的包包含循环依赖项。到目前为止,解决此问题的唯一方法是在我的包模块的开头使用以下语句:

import MInventory.Mproducts      ----> in the MStores module
import MInventory.MStores        ----> in the MProducts module

由于循环依赖项,使用以下语句会导致错误:

from MInventory import MProducts
from MInventory import MStores
ImportError: cannot import name 'MProducts'

知道为什么MInventory.MProducts.MRobot可以在一般情况下正确调用,以及为什么它在作为模块级变量或类级变量调用时不起作用?

我认为错误在于python在模块名称和要使用的函数或类的名称之间没有区别!

这个问题非常频繁,但它可以以许多不同的形式出现。在这里,您尝试进入一个名为 MInventory .此文件不存在,因此也没有模块。这就产生了问题。

也可能是您必须以另一种方式导入模块。尝试:

      from MInventory import *

      from MInventory import (MProducts, MStores)

我尝试了其他代码示例,并且效果很好。如果它不起作用,我也不知道它可能是什么。

真诚的,赫里卡

相关内容

  • 没有找到相关文章

最新更新