第二十四章 高级模块话题

#1.
#A:定义变量的时候,将_放置于变量前,可以防止客户端使用from *语句导入模块名时候,把其中那些变量名复制进去
#B:下划线声明并不类似于模块的私有声明,仍然可以通过import或者使用from指定名称的形式来看见并修改这类变量名
#C:可以在模块顶层把变量名的字符串列表赋值给变量__all__,则from *语句只会把列在__all__列表中的名字复制出来
#D:__all__列表和_放置于变量前一样,只对from *有效

#2.
#A:__name__和__main__:
#  如果文件是以顶层程序文件执行,在启动时,__name__就会设置为字符串"__main__"
#  如果文件被导入,__name__就会被设置为模块名

#3.
#A:import和from中使用as扩展
'''
import Test as T
from Test import value as v
'''

#4.
#A:得到模块的属性的方法
#B:内置函数getattr用于得到模块的属性
import sys
import Test0
value0 = Test0._value                   #value0 = 'Test'
value1 = Test0.__dict__['_value']       #value1 = 'Test'
value2 = sys.modules['Test0']._value    #value2 = 'Test'
value3 = getattr(Test0, '_value')       #value3 = 'Test'

#5.
#A:用名称字符串导入模块,可以使用exec()
#B:使用__import__运行模块对象
#C:Exec与Eval语句的主要区别是,Exec处理字符串里面的代码,而Eval是处理字符串里面的表达式
str = "Test0"
#import str                             #会报错
exec("import " + str + " as T")
#eval("import " + str + " as T")        #会报错
value = T._value                        #value = 'Test'

T0 = __import__(str)
value = T0._value                       #value = 'Test'

v0 = exec("print(10 + 20)")             #v0 = None
v1 = eval("print(10 + 20)")             #v1 = None

v0 = exec("10 + 20")                    #v0 = None
v1 = eval("10 + 20")                    #v1 = 30

#6.
#A:存在模块A,并且A导入了模块B,C,当对A进行reload的时候,A中导入B和C的语句会重新运行,但是只会获取已经载入的B和C的模块对象
'''
A.py:
import B
import C

def funA():
    return valueA, B.valueB, C.valueC

valueA = 'a'

B.py:
valueB = 'b'

C.py:
valueC = 'c'
'''
import A
value = A.funA()                        #value = ('a', 'b', 'c')

'''
将3个模块中的变量都置为对应的大写
'''
from imp import reload
reload(A)
value1 = A.funA()                       #value1 = ('A', 'b', 'c')

'''
将A.py修改为:
import B
import C

def funA():
    return valueA, B.valueB, C.valueC

valueA = 'A'

import types
from imp import reload

def FunReload(moudle, dict0):
    if not moudle in dict0:
        reload(moudle)
        str = moudle.__name__
        dict0[moudle] = None
        for value in moudle.__dict__.values():
            if type(value) == types.ModuleType:
                FunReload(value, dict0)

def reload_all(*args):
    dict0 = {}
    for arg in args:
        if type(arg) == types.ModuleType:
            FunReload(arg, dict0)
'''

A.reload_all(A)
value2 = A.funA()                       #value2 = ('A', 'B', 'C')

  

原文地址:https://www.cnblogs.com/szn409/p/6729766.html