方便地从Python包中的模块导入几个类

方便地从Python包中的模块导入几个类,python,Python,我目前正在为语法树创建一个框架。我有一个文件夹/包syntax,其中包含一个语法树元素,它是每个文件中的一个类,结构如下所示: syntax/List.py -> contains class List syntax/Block.py -> contains class Block syntax/Statement.py -> contains class Statement 现在我想将文件夹导入到我的源文件中,这样我就可以访问如下类 block = syntax.Block

我目前正在为语法树创建一个框架。我有一个文件夹/包
syntax
,其中包含一个语法树元素,它是每个文件中的一个类,结构如下所示:

syntax/List.py -> contains class List
syntax/Block.py -> contains class Block
syntax/Statement.py -> contains class Statement
现在我想将文件夹导入到我的源文件中,这样我就可以访问如下类

block = syntax.Block()

那有可能吗?到目前为止,我总是需要
syntax.Block.Block()
,这不是很好…

最可读的处理方法是将您的导入到
\uuu init\uuuuuuuuuy.py
文件中

例如:

# syntax/__init__.py
from syntax.List import List
from syntax.Block import Block
from syntax.Statement import Statement

# in your main file
from syntax import List
import syntax
b = syntax.Block()
注意:您还可以在
\uuuu init\uuuu.py
文件中使用相对导入语法(例如
从.List导入列表


在执行导入时,定义一个变量。此变量包含导入的变量、常量、函数、类或任何您想要的内容

如果您将
从.List导入列表
到您的
\uuuu init\uuuuuuuuuuuuuupy
文件中,那么您就是在引用类
语法.List
文件中定义变量
列表

from syntax import List
from syntax.List import List as OriginList

List is OriginList # True
因此,当您尝试从syntax import List编写
时,您正在尝试从
\uuu init\uuuuuuuuuuupy
文件导入变量
List
,该文件指向
syntax.List.List

from syntax import List
from syntax.List import List as OriginList

List is OriginList # True
项目结构

syntax
├── Block.py
├── __init__.py
班级

# syntax/Block.py (this file really ought to be lowercase, leave PascalCase to class names)
class Block(object):
    pass
\uuuu init\uuuuu中导入

# syntax/__init__.py
from .Block import Block   # Relative import with .
使用包

In [5]: import syntax

In [6]: b = syntax.Block()

In [7]: b
Out[7]: <syntax.Block.Block at 0x108dcb990>
然后可以使用如下

import syntax
b = syntax.Block()
l = syntax.List()

语法导入列表中的“
”行是否正确?在这种情况下,类
语法.List
和模块
语法.List
之间可能会产生混淆。他真的应该将模块名保持小写(在List.py中有类List,而不是List.py)。然而,也许这不是一个好的解决方案。你怎么看?这是一种正常的方法,除了把三个类放在一个syntax.py中,而不用麻烦把它们分成三个模块,这可能是最正常的。你真的应该保持模块名称的小写。这是实现这一点的标准方法,并且不会在类和模块之间产生混淆。