16_Python模块的导入_全栈开发学习笔记

1. 模块导入的顺序

内置模块
扩展的 django
自定义的


2. import

先创建demo.py文件:

print("in demo.py")

money = 100

def read():
    print("in read1")

再到另一py文件写上:

import demo

demo.read()

print(demo.money)

执行结果:

in demo.py
in read1
100

3. 模块导入的流程

先从sys.modules里查看是否已经被导入
如果没有被导入,就依据sys.path路径取寻找模块
找到了就导入
创建这个模块的命名空间
执行文件,把文件中的名字都放到命名空间里

范例:

import demo
import sys

print(sys.modules.keys())
print(sys.path)

执行结果:

in demo.py
dict_keys(['locale', 'heapq', 'errno', 'types', '_weakref', 'io', 'demo', 'reprlib', 'functools', 'encodings', '_thread', '_locale', 'operator', 'sre_constants', 'copyreg', '_heapq', 'winreg', '_imp', '_functools', '_operator', '_bootlocale', 'sys', 'encodings.mbcs', '__main__', 'ntpath', 'encodings.latin_1', 'weakref', '_io', 'sre_compile', 'signal', '_codecs', 'encodings.gbk', 'zipimport', 'site', 'abc', 'encodings.utf_8', 'sre_parse', 'nt', '_codecs_cn', 'keyword', '_warnings', '_collections', 'genericpath', 're', '_collections_abc', 'os', 'encodings.aliases', 'itertools', 'marshal', 'os.path', '_weakrefset', 'codecs', 'collections', '_stat', '_multibytecodec', 'stat', '_frozen_importlib', '_sre', 'builtins'])
['D:\\temp_study\\python01', 'D:\\temp_study\\python01', 'C:\\WINDOWS\\SYSTEM32\\python34.zip', 'D:\\temp_study\\python01\\venv\\DLLs', 'D:\\temp_study\\python01\\venv\\lib', 'D:\\temp_study\\python01\\venv\\Scripts', 'D:\\Python34\\Lib', 'D:\\Python34\\DLLs', 'D:\\temp_study\\python01\\venv', 'D:\\temp_study\\python01\\venv\\lib\\site-packages']

4. 给模块起别名

import time as t

print(t.time())

执行结果:

1548923779.046172

起别名的用法:

# oracle
# mysql
# if 数据库 == ‘oracle’:
#     import oracle as db
# elif 数据库 == ‘mysql’:
#     import mysql as db
# # 连接数据库   db.connect
# # 登录认证
# # 增删改查
# # 关闭数据库

5. from ... import ...

demo.py文件

print("in demo.py")

money = 100

def read():
    print("in read1",money)

一次范例:

from demo import read
read()

执行结果:

in demo.py
in read1 100

二次范例:

from demo import read
def read():
    print('my read')
read()

执行结果:

in demo.py
my read

6. _name_

范例:
正式代码不显示模块中的内容
demo.py

def login():
    print("正在执行登录程序")

if __name__ == "__main__":
    ret = login()
    print(ret)

执行结果:

正在执行登录程序
None

test.py

import demo

执行结果:

无内容

7. 小结

所有的模块导入都应该尽量往上写
    内置模块
    扩展模块
    自定义模块
模块不会重复被导入 : 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__ == '模块的名字'

你可能感兴趣的:(16_Python模块的导入_全栈开发学习笔记)