Python 总结之 import本质
了解import之前,我们得先了解什么是模块。
模块和包
模块:本质就是以.py结尾的python文件 (文件名:test.py,对应的模块名:test),是用来从逻辑上组织python代码(变量,函数,类,逻辑:模块的本质是为了实现一个功能)。
包:本质就是一个目录(必须有__init__.py文件),是用来打包多个模块(.py文件),如果想要导入一个包就是解释(执行)这个包下的__init__.py文件。
导入模块
导入模块主要有两种方式:
1. import model_name
2. from model_name import *
导入方法:
导入指定方法:from module_name import abc
导入模块中的多个方法: from module_name import abc123,abc456
导入模块中的方法:import module_name.abc
导入模块中的变量:import module_name.name
导入多个模块:import module1_name, module2_name
import 本质
我们在test.py中import bitcoin这个模块,其本质意义就是将bitcoin模块中的代码解释一遍(运行一遍)然后赋值给一个变量,这个变量就是bitcoin
from bitcoin import * 相当于将bitcoin模块中的方法给解释了一遍然后放入test.py文件中。
注意点
1. 模块路径:
>>>import sys
>>>print (sys.path)
结果打印的是默认路径的列表,导入模块时,会按照列表顺序寻找模块。找不到会报错。
因为路径是个列表,所以是可以添加路径的 sys.path.append(),当然导入的路径不是永久的。
2.模块名重用
注意在起名字的时候,不要与库中模块的名字重复,否则当你导入模块的时候可能会导入的.py文件是错误的。
3.导入模块的优化
使用import bitcoin时,text.py中的每一个函数都需要先去找bitcoin模块,然后再去找comp_bitcoin()这个方法,被调用一次就需要找一次,如果调用次数多的话,就需要大量的重复性工作,这样运行程序相对会比较慢。
这里使用from方法来导入,相当于把这个comp_bitcoin()导入到text.py文件中了,这样在调用comp_bitcoin()这个函数的时候,直接就是从本程序中直接调用,相比上一种方式运行速度会快。
4.动态模块导入时两种import的区别
运行代码时会发现:当send.py修改have_girl的值时,两个导入方式的结果是不同的,原因是因为
import girl 这个可以当做是引用
from girl import have_girl这个可以当做深拷贝
关于引用,浅拷贝和深拷贝 之后会有详解。