当我们开发一个大型的Python项目时,往往需要模块化地组织代码,使得代码逻辑清晰,易于维护。为了实现这个目标,Python提供了包(Package)这个概念。
包的本质是一个目录,该目录下包含了多个模块(Module)文件和一个名为__init__.py
的文件。在我们使用包中模块中的对象时,需要先导入这些对象。在导入时,Python解析器会按照一定的规则查找包结构,以找到对应的模块文件。
下面是解析Python编程中的包结构的完整攻略:
创建一个包
创建包的方法很简单,只需要在任意目录下新建一个目录,并在目录中新建一个__init__.py
文件即可。
例如,我们将在一个名为my_package
的目录中创建一个包。
$ mkdir my_package
$ touch my_package/__init__.py
此时,my_package
就已经成为了一个空的Python包。
导入包中模块
在Python中,我们可以使用import
语句来导入包中的模块。假设我们在my_package
目录下有一个名为module1.py
的模块,我们可以通过以下方式导入该模块中的对象:
import my_package.module1
也可以使用以下简化版的方式导入:
from my_package import module1
当我们导入my_package
包时,Python解析器会自动执行__init__.py
文件。我们可以在该文件中编写一些初始化代码。例如,我们可以在__init__.py
文件中导入module1
模块中的所有对象:
from my_package.module1 import *
包中的模块相互导入
在包中,模块之间往往会相互导入。这时需要注意避免循环导入的问题。例如,我们在my_package
中的module2.py
中导入了module1.py
中的某个对象,同时在module1.py
中又导入了module2.py
中的某个对象,就会导致循环导入。
为了避免循环导入,我们可以在my_package
包的__init__.py
文件中导入需要的模块,然后在其他模块中使用from my_package import xxx
的方式进行导入。
例如,我们在__init__.py
文件中导入module1.py
和module2.py
中的某些对象,并定义一个函数my_func()
:
from my_package.module1 import my_var1, my_func1
from my_package.module2 import my_var2, my_func2
def my_func():
print(my_var1)
print(my_var2)
my_func1()
my_func2()
在module1.py
中引用my_func()
时,我们可以这样导入:
from my_package import my_func
示例说明1:使用自己编写的包
假设在/Users/john/
路径下,有一个包my_package
。其中目录结构如下所示:
my_package/
|-- __init__.py
|-- module1.py
`-- module2.py
__init__.py
中的代码如下:
from my_package.module1 import *
from my_package.module2 import say_hello
my_var = 1000
module1.py
中的代码如下:
from my_package.module2 import my_var
def my_func():
print(my_var)
module2.py
中的代码如下:
my_var = 99
def say_hello():
print("Hello from module2!")
如果我想在/Users/john/test/
这个路径下运行一个Python程序run.py
,并使用my_package
包中的对象。可以在run.py
中导入my_package
包,并使用其中的对象:
import sys
sys.path.append('/Users/john/')
from my_package import my_var, my_func, say_hello
print(my_var)
my_func()
say_hello()
输出结果为:
1000
99
Hello from module2!
示例说明2:使用Python内置模块中的子模块
Python自带了很多标准库和扩展库。其中很多库都是以包和模块的形式进行组织。例如,os
库是一个包,其中包含了很多模块。我们可以从os
包中导入子模块,在使用过程中可以参照包的解析规则。
import os.path
print(os.path.abspath('.'))
print(os.path.basename('/path/to/file'))
代码功能:输出当前文件的绝对路径和/path/to/file
路径下文件的文件名。
在该示例中,我们导入了os
包中的path
模块,通过os.path
的方式进行调用。因为在Python中,包的导入是按照一定的规则进行解析的。每个导入了的包,都有自己的__init__.py
文件,通过这个文件我们可以自定义包中对象导入的方式。在Python标准库中,os.path
就是一个子模块,可以按照包的解析规则进行导入和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析Python编程中的包结构 - Python技术站