模块

此章详细地址 http://www.cnblogs.com/Eva-J/articles/7292109.html#_label2

模块导入相当于执行了模块里面的代码

导入sys模块通过path与modules来查询模块的可以导入的路径和是否导入了此模块

print(sys.modules.keys()) 查看导入和内置模块

在模块中 有一个变量__name__,
当我们直接执行这个模块的时候,__name__ == '__main__'当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'

模块的导入

同时导入两种但操作步骤一样

if 'shujuku' == 'demo':
    import demo as f
elif 'shujuku'=='demo1':
    import demo1 as f
f.read1()
from time import sleep
sleep(5)#此时由于导入的方法,所以不用加上前缀,time.sleep()

模块的导入的变量冲突

print('from the my_module.py')
money=1000

def read1():
    print('my_module->read1->money',money)

def read2():
    print('my_module->read2 calling read1')
    read1()

def change():
    global money
    money=0

这是我定义的一个demo模块

然后在主界面上执行下面的代码

from demo import money,read1
print(money)#from the my_module.py 1000
money = 20#
print(money)#20
read1()#my_module->read1->money 1000

可以看出当变量重定义是,变量就改变了,但是模块内的的变量例如read1()的money值始终没有变,用为此时money是一个始终不变的的内存地址

 

from demo import *

 

这段代码表示把所有的变量,函数都导入进来了,同时执行里面的代码。但是不推荐,因为你不知道里面的变量的具体情况

同理覆盖函数覆盖效果

from my_module import read1
def read1():
    print('==========')
read1()
'''
执行结果:
from the my_module.py
==========
'''

 

如果在模块中加入__all__=[函数名,变量],则用from demo import *是只导入[]中的数据,而不导入其他变量

__name__的用法

__name__主要查看的是当前py文件的名字,当py文件独立运行的时候,而自己的文件里面有print(__name__)时,便会打印出当前的文件名,如果py文件里面import了模块时,模块里面也有单独执行print(__name__)便会打印出模块的名字,利用这个便可以实现被当做模块式会不执行某些代码,而独立运行时便会执行某些代码。下面请看代码。

 

#假如这段代码既可以独立执行,但也可以被当做模块文件名是demo
def fib(n): a, b
= 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() if __name__ == "__main__": #如果独立运行时__name__的输出结果为__main__,及运行以下代码
                      #如果被当做模块运行时__name__的输出变为demo 及!= __main__便会不执行以下代码 print(__name__) num
= input('num :') fib(int(num))

 模块的总结

所有的模块导入都应该尽量往上写
内置模块
扩展模块
自定义模块
模块不会重复被导入 : sys.moudles
从哪儿导入模块 : sys.path
import
import 模块名
模块名.变量名 和本文件中的变量名完全不冲突
import 模块名 as 重命名的模块名 : 提高代码的兼容性
import 模块1,模块2

from import
from 模块名 import 变量名
直接使用 变量名 就可以完成操作
如果本文件中有相同的变量名会发生冲突
from 模块名 import 变量名字 as 重命名变量名
from 模块名 import 变量名1,变量名2
from 模块名 import *
将模块中的所有变量名都放到内存中
如果本文件中有相同的变量名会发生冲突
from 模块名 import * 和 __all__ 是一对
没有这个变量,就会导入所有的名字
如果有all 只导入all列表中的名字
__name__
在模块中 有一个变量__name__,
当我们直接执行这个模块的时候,__name__ == '__main__'
当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'