python的函数、模块、包

时间:2021-03-07 19:13:43

1. python程序结构

python的程序结构由函数(function)、模块(module)和包(package)组成。

——模块是一系列函数和类的集合,一个python文件就是一个模块。

——包是一系列模块的集合,一个包含__init__.py文件的文件夹是一个包。就像一个文件夹可以再包含子文件夹,一个包也可以再包含子包。

例如,我们可以定义一个这样的包:

package1/
    __init__.py
    subPack1/
        __init__.py
        module_11.py
        module_12.py
        module_13.py
    subPack2/
        __init__.py
        module_21.py
        module_22.py

2. __init__.py文件

__init__.py文件定义了包的属性和方法,通过这些属性和方法控制着包的导入行为,它的内容可以为空。

2.1 假如__init__.py的内容为空,那么仅仅导入包是什么都做不了的。

>>> import package1
>>> package1.subPack1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'subPack1'

我们需要在package1/__init__.py里把subPack1预先导入:

#文件package1/__init__.py
import subPack1

现在可以在使用subPack1了:

>>> import package1
>>> package1.subPack1
<module 'package1.subPack1' from 'package1/subPack1/__init__.py'>

2.2 __init__.py 中还有一个重要的属性,叫做 __all__。

有时,我们会在import语句中使用通配符*,导入某个package中的所有元素,这就是通过__all__实现的,它定义了当使用*导入时,有哪些元素会被导入。

例如,我们在subPack1/__init__.py中写入:

__all__ = [“module_12”, “module_13”]

然后尝试使用subPack1中的module:

>>> from package1.subPack1 import *
>>> package1.subPack1.module_11
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'module_11'
>>> package1.subPack1.module_12
<module 'package1.subPack1.module_12' from 'package1/subPack1/module_12.py'>
>>> package1.subPack1.module_13
<module 'package1.subPack1.module_13' from 'package1/subPack1/module_13.py'>

 

3. 模块的导入

1. import module_name
2. from module_name import func_name
3. from module_name import *

import语句可以多次使用,即使导入的是同一个模块

import语句可以置于文件的任意位置,甚至可以在条件语句中:

if a > 0 :
import module_name

 

4.  模块的内置属性

__name__:判断当前模块是否是程序的入口——1)如果模块是被导入,__name__的值为模块名,2)如果模块是被执行,__name__的值的为"__main__"。

__file__:用来获得模块所在的路径——1)如果程序以相对路径执行,__file__的值为相对路径,2)如果以绝对路径执行,__file__的值为绝对路径。

__doc__:文档字符串