当前位置: 首页 > 知识库问答 >
问题:

关于python继承、导入的一些问题

章安易
2023-03-14

我不熟悉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

在main.py中:

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

在modulescript.py:

from BaseAction import BaseAction
baseAction = BaseAction() 

在BaseModel.py:

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

在BaseAction.py中:

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

在ModelImpl.py中:

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

在ActionImpl.py中:

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

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

BaseModel   
ModelImpl   
BaseModel   
BaseAction   
ActionImpl

但如果我输入python3 module function.py,我会得到错误:

回溯(最近一次呼叫最后一次):

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

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

我在BaseAction.py中发现它是由导入语句引起的:

from .BaseModel import BaseModel 

如果我更改为从BaseModel导入BaseModel,modulescript.py运行正常,但main.py将得到一个错误:

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

file"/home/jerry/project/test/python/ActionImpl.py",第1行,在(模块)从base开始。BaseAction导入BaseAction

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

没有名为BaseModel的模块

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

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


共有2个答案

何雅惠
2023-03-14

我得到了同样的错误但错误得到了修复当我改变

from .BaseModel import BaseModel

from base.BaseModel import BaseModel
潘嘉佑
2023-03-14

这是Python,而不是Java,您可以将相互相关的模块分组到一个单独的包(即文件夹)中。

为了能够从包中导入,您必须先做几件事。

>

  • 在包中创建__init__. py,让解释器知道它是一个包。如果文件夹中没有这样的文件,它甚至不会移动是否要从那里导入,它不是一个包,仅此而已。

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

    我举了一个简单的例子:

    项目树

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

    编辑:如果你想让examplepkg有一个“嵌套”的包,比如在它以某种方式依赖的包中,你可以创建另一个文件夹,在其中放入另一个\uuu init\uuuuuuuuuuuuuuuuuuuuupy并做同样的事情,然后在examplepkg的\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy.py中你可以进一步“。如何做到这一点取决于你自己,只是要始终如一。

    somemodule.py

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

    \uuuu init\uuuuu.py

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

    test.py

    from examplepkg import SomeClass
    
    
    SomeClass()
    

    有关更多信息,请阅读此。

  •  类似资料:
    • 本文向大家介绍关于C++中菱形继承和虚继承的问题总结,包括了关于C++中菱形继承和虚继承的问题总结的使用技巧和注意事项,需要的朋友参考一下 前言 菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。本文将给大家详细介绍关于C++菱形继承

    • 本文向大家介绍深入浅析python继承问题,包括了深入浅析python继承问题的使用技巧和注意事项,需要的朋友参考一下 有如下的代码: 然后代码的运行结果如下: 关于的代码的运行过程,我有以下的疑问,我在 c1 的 __init__ 函数中会调用到p1.__init__(),然后会每次都是运行 c1.f1() 函数,没有运行 p1.f1() 的函数,在 p1 运行的 f1(),怎么也是 c1.f1

    • 问题内容: 给定以下示例类… 以及以下Spring-AOP切入点… 对Bar实例的上述切入点应用建议的结果是什么?特别是… 我想我缺少切入点如何与继承交互的一些基本真理,因此幕后的解释/文档可能会走很长一段路。 问题答案: 从aspectj文档中: 在匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将仅匹配该类型中声明的方法或覆盖该类型中声明或继承的方法的方法。所以切入点 执行

    • 本文向大家介绍浅谈Python中重载isinstance继承关系的问题,包括了浅谈Python中重载isinstance继承关系的问题的使用技巧和注意事项,需要的朋友参考一下 判断继承关系 通过内建方法 isinstance(object, classinfo) 可以判断一个对象是否是某个类的实例。这个关系可以是直接,间接或抽象。 实例的检查是允许重载的,可见文档customizing-insta

    • 关于cesium的一些报错问题,现在出现这些报错 还有上下文丢失的情况,因为不懂cesium,有人帮忙排查下问题吗

    • 在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。 Python 中继承的语法如下: class Parent: pass class Child(Parent): pass 在第 1 行,定义了父类 Parent; 在第 4 行,定义了子类 Child,语法