# moudle2.py
import sys print(__name__) print(sys.modules["__main__"]) # 获取当前文件的内存地址 print(sys.modules[__name__]) # 在本文件中__name__ 就是__main__ # __main__ # <module '__main__' from 'F:/python/12_27/day11/module2.py'> # <module '__main__' from 'F:/python/12_27/day11/module2.py'> def func(): print("aaa") getattr(sys.modules[__name__],"func")() # __name__ 表示是写在哪个文件理,找的就是哪个文件的命名空间
# 反射模块中的内容module2.py
import module2 # module2 # <module '__main__' from 'F:/python/12_27/day11/反射本模块中的类容module2.py'> __main__ 永远获取的是当前文件地址 # <module 'module2' from 'F:\python\12_27\day11\module2.py'> # AttributeError: module '__main__' has no attribute 'func' 报错,因为此时__main__表示的是当前文件
pyc编译文件和重新加载模块.py
# 当一个文件作为一个脚本导入的时候,就会在这个文件所在目录生成一个 pycache 文件,为了之后导入这个文件的时候直接读这个编译好的pyc文件就好l # 可以节省一些导入时候的时间 # 如果修改了这个文件,那么会比较生成pyc文件的时间和原文件最后一次修改时间,如果在生成pyc时间在之前,那么pyc文件会更细 import aa import time import importlib aa.login() time.sleep(7) importlib.reload(aa) aa.login() # 在import后修改模块,程序是感知不到的。reload()这种方式可以强制让程序加载一次,但不推荐使用
aa.py
def login(): print("hel world")
18.48模块的循环导入.py
# 在模块的导入中 不要产生模块的循环引用问题 # 如果循环导入了,就会发现写在模块中的方法却找不到 import clas def funcb():print("bbbbb") clas.funca()
import student def funa():print("aaaa") student.funcb() # AttributeError: module 'student' has no attribute 'funcb' # 这里import student 去找到这个文件,执行import clas 又回来执行,发现 import student 但模块不会循环导入,所以向下走,将funa存入命名空间,执行funcb() # 但是之前只执行到了import clas就回来了,所以会找不到这个变量名