关于python继承的一些问题,imp

2024-09-23 22:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python不熟悉,但对java很在行。现在我在python3.5上训练时遇到了一个恼人的问题,我有这样一个src结构:

/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

在主.py地址:

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

在模块脚本.py地址:

from BaseAction import BaseAction
baseAction = BaseAction() 

在基本模型.py地址:

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

在基本操作.py地址:

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

在模型实现.py地址:

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

在操作impl.py地址:

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

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

BaseModel   
ModelImpl   
BaseModel   
BaseAction   
ActionImpl

但如果我输入python3模块函数.py,出现错误:

Traceback (most recent call last):

File "modulescript.py", line 1, in (module) from BaseAction import BaseAction

File "/home/jerry/projects/test/python/base/BaseAction.py", line 1, in (module) from .BaseModel import BaseModel SystemError: Parent module '' not loaded, cannot perform relative import

我发现这是因为基本操作.py地址:

from .BaseModel import BaseModel 

如果我改为from BaseModel import BaseModel,则模块脚本.py运行正常,但是主.py将出现错误:

File "main.py", line 225, in (module) from ActionImpl import ActionImpl

File "/home/jerry/projects/test/python/ActionImpl.py", line 1, in (module) from base.BaseAction import BaseAction

File "/home/jerry/projects/test/python/base/BaseAction.py", line 1, in (module) from BaseModel import BaseModel

ImportError: No module named 'BaseModel'

哎呀。烦人的! 在java中,如果提供了类的正确路径(如import com.domain.MyClass;),则可以从任何位置导入任何类

那么,用python导入的正确方法是什么?你知道吗


Tags: infrompyimportbaseinit地址line
2条回答

这是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。你知道吗

我得到了同样的错误,但错误得到了纠正,当我改变

from .BaseModel import BaseModel

from base.BaseModel import BaseModel

相关问题 更多 >