【python】包(package)与模块(module)、import、__name__与__main__
导入模块一般写在程序最前面,且顺序为:内置模块、第三方模块、自定义模块
一、模块(module)与包(package)
模块(module)可以理解为是一个.py文件,import 模块 相当于执行了 这个.py文件
包(package)可以理解为包含着__init__.py的文件夹,import 包 相当于执行了 对应的__init__.py文件
(一个包中可以包含多个模块/多个包)
以pycharm为例,包与普通文件夹的图片如下所示(如果把__init__.py文件删除,则图标变为普通文件夹的图标)
二、模块的import与from import
导入模块的语法:
# 导入模块
import 模块名 as 别名 # 执行模块名.py
# 导入模块中某个函数/类/变量
from 模块名 import 函数名/类名/变量 as 别名 # 也会执行模块名.py,但只能用所导入的函数名/类名/变量
查找模块的顺序:
import sys
print(sys.path)# 输出包含多个文件夹路径的列表
模块的查找顺序是根据sys.path列表中的路径顺序进行的,大致如下:
- 先找当前py文件的同级目录下是否有对应模块
- 找当前项目目录下是否有对应模块
- 找python解释器目录下是否有对应模块
导入模块的具体流程:
判断内存中是否已加载了对应模块,如已加载则直接返回内存地址,如没加载则开辟一块内存,执行所导入的模块中的所有python代码。
内置变量__name__:
每个python文件中都会有内置的__name__变量
直接运行该python文件的时候,__name__的值是__main__
当以模块的形式导入该python文件时,__name__的值是模块名(比如abc.py则值就是abc)
比如以下python文件命名为a.py,当直接运行该文件则会打印出"测试案例",在其他python文件中import a时则不会打印出"测试案例"
def func():
print("a模块里的func被调用了")
class Student:
def __init__(self,name):
self.name = name
def eat(self, food):
print(f"{self.name}在吃{food}")
if __name__ == '__main__':
print("测试案例")
三、包的import与from import
导入包中模块的语法:
# 导入包
import 包名 # 执行包名下的__init__.py
# 直接导入模块(不常用)
import 包名.(包名.)模块名
# 导入包里某个模块(常用)
from 包名(.包名) import 模块名
# 导入包里某个模块的具体类、方法(常用)
from 包名.(包名.)模块名 import (函数名/类名/变量)
注意:from import语法中import后面不允许出现 "." !!!!!!!
示例:
# 导入policy模块
from glance.api import policy
# 导入policy中Student这个类
from glance.api.policy import Student