在Python中处理多个代码文件和文件夹

15 投票
2 回答
37737 浏览
提问于 2025-04-16 17:41

我刚开始学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 个回答

1

我了解到,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

18

你应该了解一下模块的概念:http://docs.python.org/tutorial/modules.html

简单来说,我觉得你的代码组织得不太对。在Python中,目录和文件是有意义的;它们不仅仅是你写在文件里的内容。每当你创建一个新的目录(里面有__init__.py文件)和每个新的文件时,你就创建了一个新的“命名空间”...

比如说,如果你有一个文件/mydatabase/model.py,而在这个model.py文件中定义了Table1Table2等类,你可以简单地:

from mydatabase.model import *

不要为每个Table类创建一个新的文件!

撰写回答