Python的包与模块
包(package)
一个包(package)是一个目录下模块的集合。包的名字就是目录的名字。
只需要在目录下添加一个名为__init__.py 的文件(通常是空文件)就可以告诉Python 这个目录是一个包。
如果忘记添加__init__.py文件,就没办法从目录导入模块了。
包的特殊模块:init.py
理解:将目录定义为包的__init__.py 文件
模块(module)
(1)Python模块对应于一个py磁盘文件
(2)Python语言允许同一目录下的两个模块中的类可以相互导入使用,即:import【能不能不同目录下的模块也可以通过绝对路径,导入类使用】
(3)import 语句用于从模块中导入模块或特定的类、函数
示例:
设有文件名:database.py
其中有个类:Database
import语句语法存在以下几种变式:
(1)
import database #模块名,也就是对应py的文件名
db=database.Database()
(2)
from database import Database #Database是类名(采用驼峰命名法),这里不需要括号
db=Database()
(3)如果因为某些原因,products 已经有一个名为Database 的类,而我们不想将这两个类名搞混,可以将导入的类名重命名之后用于products 模块
from database import Database as DB
db = DB()
(4)也可以从一个模块中同时导入多个类
from database import Database, Query
(5)或者导入模块的全部类【但这种方法有损效率,也会让代码晦涩难懂】
from database import *
组织模块
假设:模块(py文件)放入工作目录【包】(parent_directory)下的子目录【包】ecommerce中
parent_directory/
main.py
ecommerce/
__init__.py
databases.py
products.py
payments/
__init__.py
square.py
stripe.py
注意:子目录ecommerce, 孙目录payments下存在__init__.py
在包(目录)之间导入模块或类的时候要注意语法:
(1)绝对导入
绝对导入是指定我们想要导入的模块、函数或路径的完整路径.
三种等效示例
import ecommerce.products
product = ecommerce.products.Product() #比较费解难记,点号操作符(period operator)不能让人一眼就区分包或模块
#或者
from ecommerce.products import Product #自明性好
product = Product()
#或者
from ecommerce import products #费解难记
product = products.Product()
绝对导入的好处是不需要在导入时记住包之间的目录层次关系,相对导入是需要的
(2)相对导入
相对导入基本上是一种寻找与当前模块在位置上有相对关系的类、函数或模块的方式.
from .databases import Database #导入当前包内的模块database中的类Database
from ..databases import Database #导入父包中的模块database中的类Database
模块的特殊变量:main
每个模块都有一个特殊变量__name__存储模块被导入时的名字。
如果:
if __name__ == "__main__":
一直返回“True”说明该模块未被导入,所以常可以用作把某个模块的类的函数作为唯一入口:也就是说该模块没被“导入过”,而是直接“执行”了就会判断该语句。
从另一个侧面说明:py文件的,不在类中或者对象、函数中的语句也是可以运行的,可能有点费解:是因为本人一直熟悉C++ 的类,对象,函数(方法)的关系,大部分语句都是写在具体的类中的函数内的,虽然C++ 有全局、静态变量。对于PYTHON变量、函数或对象、类的访问和作用范围也是需要好好理解的。
一般来说,任何Python 语句都可以在任何时间执行