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

时间:2015-07-22 11:32:10

标签: python

我目前正在为语法树创建一个框架。我有一个文件夹/包myserver01-teraterm.log myserver02-teraterm.logfile myserver03-teraterm.log ,其中包含一个语法树元素,它是每个文件中的一个类,结构看起来像:

syntax

现在我想以一种我可以访问类的方式将文件夹导入我的源文件,如

syntax/List.py -> contains class List
syntax/Block.py -> contains class Block
syntax/Statement.py -> contains class Statement

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

2 个答案:

答案 0 :(得分:5)

项目结构

syntax
├── Block.py
├── __init__.py

班级

# syntax/Block.py (this file really ought to be lowercase, leave PascalCase to class names)
class Block(object):
    pass

__init__

中的导入
# 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>

如果您对某些重组

持开放,则替代

要求我们将单个类放入具有相同名称的文件(文件Block中的类Block.py)的语言不同,Python对此非常灵活。 / p>

您实际上可以在syntax.py中添加多个类并单独导入syntax,然后访问syntax.Block(此时不需要__init__.py中的导入)

# syntax.py
class Block(object):
    pass
class List(object):
    pass

然后可以使用如下

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

答案 1 :(得分:4)

最可读的处理方法是将导入导入__init__.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()

注意:您还可以使用__init__.py文件中的相对导入语法(例如from .List import List

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

如果您在from .List import List文件中__init__.py,则要将变量List定义到引用课程__init__.py的{​​{1}}文件中。

因此,当您尝试编写syntax.List.List时,您尝试从from syntax import List文件导入变量List,该文件指向__init__.py

syntax.List.List