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