我目前正在为语法树创建一个框架。我有一个文件夹/包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()
,这不是很好......
答案 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