模块中的反射

# 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就回来了,所以会找不到这个变量名

 

posted @ 2019-03-27 18:29  杨fj  阅读(92)  评论(0编辑  收藏  举报