在Python中处理多个代码文件和文件夹
我刚开始学Python,还没弄明白怎么把代码分成多个文件和文件夹。
我现在的做法是:每个文件夹里我都会创建一个__init__.py
文件。有时候这个文件是空的。我也不知道为什么要这样做,但感觉好像是必须的。这是我和C#工作时的第一个不同之处。
第二个不同是,如果我想在一个文件里引用另一个文件的内容,我必须使用导入,比如from model.table import Table
。如果我有多个引用,就得写多个导入:
from model import table1,table2
然后在其他代码里,我必须用table1.Table1
来引用。例如,如果我不想这样做,我应该
from model.table1 import Table1
from model.table2 import Table2
这样就可以直接用Table1
了。
这和我在C#里的习惯差别太大了,因为在C#中,如果所有文件都在同一个命名空间里,就不需要import
。我能不能有更简单的方法呢?
2 个回答
我了解到,Python的导入系统和C#的命名空间挺相似的。如果你愿意的话,可以在__init__.py
文件里自定义模块的导入行为。你还可以使用import *
或者from x import *
来把一个模块里所有公开的对象都引入到你当前的命名空间里。
在C#中,你可以这样做:
using System;
Console.WriteLine("hello world!");
在Python中,你可以这样做(这是一个完全虚构的例子):
system/
system/__init__.py
system/console.py
在__init__.py
文件里:
import console
在system/console.py
文件里:
import sys
def write_line(s):
sys.stdout.write(s)
现在在你的Python代码中,你可以这样写:
from system import *
console.write_line('hello world!')
不过,这在Python中一般不被认为是个好主意。如果想了解更多细节和好的建议,可以看看这篇文章:http://effbot.org/zone/import-confusion.htm
你应该了解一下模块的概念:http://docs.python.org/tutorial/modules.html
简单来说,我觉得你的代码组织得不太对。在Python中,目录和文件是有意义的;它们不仅仅是你写在文件里的内容。每当你创建一个新的目录(里面有__init__.py
文件)和每个新的文件时,你就创建了一个新的“命名空间”...
比如说,如果你有一个文件/mydatabase/model.py
,而在这个model.py
文件中定义了Table1
、Table2
等类,你可以简单地:
from mydatabase.model import *
不要为每个Table
类创建一个新的文件!