有关python继承,导入的一些问题

时间:2018-11-12 08:23:53

标签: python python-3.x

我是python的新手,但是精通Java。现在,当在python3.5上进行培训时,我面临一个令人讨厌的问题,我具有这样的src结构:

class FlattenWithMasking(Flatten):
        def __init__(self, **kwargs):
                self.supports_masking = True
                super(FlattenWithMasking, self).__init__(**kwargs)

        def compute_mask(self, x, mask):
                return mask    

在main.py中:

/project-root  
--main.py  
--ModelImpl.py #subclass of BaseModel  
--ActionImpl.py #subclass of BaseAction  
--/base  
----BaseModel.py #base class of all  
----BaseAction.py #subclass of BaseModel  
----modulescript.py

在modulescript.py中:

from ModelImpl import ModelImpl
from ActionImpl import ActionImpl
modelImpl = ModelImpl()
actionImpl = ActionImpl()

在BaseModel.py中:

from BaseAction import BaseAction
baseAction = BaseAction() 

在BaseAction.py中:

class BaseModel: 
  def __init__(self):
    print("BaseModel")

在ModelImpl.py中:

from .BaseModel import BaseModel
class BaseAction(BaseModel):
  def __init__(self):
    super().__init__()
    print("BaseAction")

在ActionImpl.py中:

from base.BaseModel import BaseModel
class ModelImpl(BaseModel):
  def __init__(self):
    super().__init__()
    print("ModelImpl")

现在,当我在终端中输入python3 main.py时,我得到了打印结果:

from base.BaseAction import BaseAction
class ActionImpl(BaseAction):
  def __init__(self):
    super().__init__()
    print("ActionImpl")

但是如果我输入python3模块function.py,我得到了错误:

  

回溯(最近通话最近一次):

     

BaseAction导入BaseAction的(模块)中的文件“ modulescript.py”,第1行

     

.BaseModel导入(模块)中的文件“ /home/jerry/projects/test/python/base/BaseAction.py”,行1,BaseModel SystemError:父模块“”未加载,无法执行相对导入

我发现这是由于BaseAction.py中的import语句引起的:

BaseModel   
ModelImpl   
BaseModel   
BaseAction   
ActionImpl

如果我更改为from .BaseModel import BaseModel ,则modulescript.py可以正常运行,但是main.py将出现错误:

  

来自ActionImpl导入ActionImpl的(模块)中的文件“ main.py”,第225行

     

文件“ /home/jerry/projects/test/python/ActionImpl.py”,第1行,位于base.BaseAction(模块)中,导入BaseAction

     

从BaseModel导入BaseModel的(模块)中的文件“ /home/jerry/projects/test/python/base/BaseAction.py”,第1行

     

ImportError:没有名为“ BaseModel”的模块

糟糕。烦人! 在Java中,如果您提供类的正确路径,例如from BaseModel import BaseModel

,则可以从任何地方导入任何类。

那么,导入python的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

这是Python,而不是Java,您将彼此相关的模块归为一个包,即一个文件夹。

要能够从软件包中导入,您必须先做一些事情。

  1. 在您的程序包中创建__init__.py,以使解释器知道它是一个程序包。如果文件夹中没有这样的文件,则无论您是否要从那里导入,它都不会动摇,这不是它的包,仅此而已。

  2. 此外,如果您希望(并且在创建要供他人使用的包时应该这样做),请在__init__.py中导入类函数等,以允许直接从包本身中导入它们。

我举了一个简单的例子:

project tree

/root
  test.py
  /examplepkg
    __init__.py
    somemodule.py

编辑:如果您希望examplepkg具有“嵌套”程序包,例如,它以某种方式依赖于该程序包,则创建另一个文件夹,然后在其中放置另一个__init__.py并执行相同的操作,然后在examplepkg的__init__.py中,您可以进一步将其“导出”以供顶层模块查看。保持一致的方式取决于您自己。

somemodule.py

class SomeClass:
    def __init__(self):
        print("New Instance of SomeClass!")

__init__.py

from .somemodule import SomeClass # you could see it as exporting

test.py

from examplepkg import SomeClass


SomeClass()

有关更多信息,请read this

答案 1 :(得分:0)

我遇到了相同的错误,但是当我更改时错误得到了解决

from .BaseModel import BaseModel

from base.BaseModel import BaseModel