我需要知道如何设置__init__.py和import以便构造一个python项目,在这里我可以在整个包中使用完全限定的名称.
该软件包将包含许多子软件包,其中可能包含冲突的名称.包中包含的类将彼此子类化,并包含彼此的引用.将生成该项目,因此使用完全限定的名称将使生活变得更加简单.
这个示例项目代表了我要针对的结构,但只包含一个子项目,而IDE似乎对它运行时失败感到满意.
MyPackage / __ init__.py
import SubPackage as SubPackage
@H_403_14@MyPackage / SubPackage / __ init__.py
from .FileB import ClassB from .FileA import ClassA
@H_403_14@MyPackage / SubPackage / FileA.py
from __future__ import absolute_import import MyPackage class ClassA(MyPackage.SubPackage.ClassB): thingA: 'MyPackage.SubPackage.ClassA' thingB: MyPackage.SubPackage.ClassB def __init__(self): self.thingA = None self.thingB = None def test(self): self.thingA = MyPackage.SubPackage.ClassA() self.thingB = MyPackage.SubPackage.ClassB()
@H_403_14@MyPackage / SubPackage / FileB.py
from __future__ import absolute_import import MyPackage class ClassB(object): nextB: 'MyPackage.SubPackage.ClassB' def __init__(self): self.nextB= None def test(self): self.nextB= MyPackage.SubPackage.ClassB()
@H_403_14@test.py
import MyPackage x = MyPackage.SubPackage.ClassA()
@H_403_14@File "C:\temp\Test.py",line 3,in <module> import GeneratedLx File "C:\temp\MyPackage\__init__.py",line 1,in <module> import Bs as Bs File "C:\temp\MyPackage\SubPackage\__init__.py",line 12,in <module> from .FileA import ClassA File "C:\temp\MyPackage\SubPackage\FileA.py",line 5,in <module> class ClassA(MyPackage.SubPackage.ClassB): AttributeError: module 'MyPackage' has no attribute 'SubPackage'
@H_403_14@
最佳答案
您已经在SubPackage级别上没有名称冲突,因此添加MyPackage完全是多余的,并且不能完全按照您尝试使用它的方式工作.这可能是由于绑定名称或其他原因引起的,但是最终在您需要时没有实例.这使您可以稍微编辑以下文件:“ FileA.py”和“ FileB.py”:
FileA.py
from __future__ import absolute_import from MyPackage import SubPackage class ClassA(SubPackage.ClassB): thingA: 'SubPackage.ClassA' thingB: SubPackage.ClassB def __init__(self): self.thingA = None self.thingB = None def test(self): self.thingA = SubPackage.ClassA() self.thingB = SubPackage.ClassB()
@H_403_14@FileB.py
from __future__ import absolute_import from MyPackage import SubPackage class ClassB(object): nextB: 'SubPackage.ClassB' def __init__(self): self.nextB= None def test(self): self.nextB= SubPackage.ClassB()
@H_403_14@import语句也等效于使用相对导入而不是绝对的from..import子包,如果需要的话.从风格上讲,我倾向于使用相对导入来帮助我快速找出哪些导入是项目的一部分,哪些是外部依赖项.