#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')