1 模块的知识回顾
1.模块不会被重复导入
2,import导入一个模块(from import 的时候发生了什么)相当于执行这个模块
3.模块有自己独立的命名空间
4.模块的重命名as
5.模块没导入之前在硬盘上,不在内存上
2 导入模块的方法
import 包.包.模块
from 包.包.包 import 模块
包.包.模块.变量
模块.变量
3 pyc编译文件和重新加载模块
当一个文件作为一个脚本被导入的时候,就会在这个文件所在的目录的pycache下生成一个编译好的文件, 为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以,可以节省一些导入时候的时间,节省时间,提高效率
4 运行py文件的两种方式(模块/脚本)
以模块的形式运行
代码块
import my_modules
if __name__ == '__main__':
my_modules.login('wangsiyu')
print(__name__)
以脚本形式运行,在pycharm中运行
代码块
那么需要在本文件中直接打印的代码上加上
if __name__ == '__main__':
在编写py文件的时候
所有不在函数和类中封装的内容都应该写在
if __name__ == '__main__':后面
5 反射自己模块的变量
代码块
import sys
name='wangsiyu'
def login(name):
print('hello',name)
#利用反射拿到相关的变量
res=getattr(sys.modules['__name__'],'login')
res('nex' ) #相当于利用反射调用login()函数 hello nex
# import sys
#
# getattr(sys.modules[__name__],变量名)
6 怎样知道自定义模块是否可以被导入
看sys.path当中 是否存在你要导入的文件 所在的目录,如果没有目录,可以把要执行文件目录添加到sys,path的列表中
7 模块的导入层级
模块的搜索路径全部存储在sys.path列表中
如果要导入的模块和当前执行的文件同级
直接导入即可
如果要导入的模块和当前执行的文件不同级
需要把要导入模块的绝对路径添加到sys.path列表中
8 模块的重加载
代码块
import my_modules
import importlib
import time
#在 import之后,再修改模块里面,程序感知不到。
try:
print(my_modules.name) # 这个时候会报错,因为模块my_modules没有name
# 如果这时候去my_modules去添加一个name呢?
except AttributeError:
print("module 'my_modules' has no attribute 'name'")
time.sleep(10) #暂停10秒
#
importlib.reload(my_modules) #重加在这个模块,这个时候可以看到修改的模块了。
print(my_modules.name) #因为重新加载了,所以此时有了。
9 总结
9-1
from 模块import 名字
导入这个模块中的某个名字之后,这个名字就可以直接使用了
名字是变量 直接用
名字是函数 函数名()就是调用
名字是类名 类名()就是实例化
代码块
from my_modules import name ,Student,login #导入变量,类,和函数
print(name) #调用变量
#调用类
s=Student()
s.run()
#调用函数
login()
9-2
把模块当作脚本用。
把模块当成脚本运行:
你希望 某一段代码 在被当做模块导入的时候 不要执行
就把它写在if name =='main':下面
代码块
def login():
print('success')
name=123
# 你希望 某一段代码 在被当做模块导入的时候 不要执行
#
# 就把它写在if __name__ =='__main__':下面
#如果调用my_modules这个模块,那么Student这个类不能被调用
if __name__ == '__main__':
class Student:
def __init__(self):
pass
def run(self):
print('我可以奔跑')
9-3
sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径
9-4
如果是直接导入一个包,那么相当于执行了这个包中的init文件
并不会帮你把这个包下面的其他包以及py文件自动的导入到内存
如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用
那么你要自己处理init文件,在文件中提前写好导入。
网友评论