现在开始学模块相关的东西。
模块化
模块(module),相当于一种储存代码的容器。那么模块化的思想就是将完整的代码分解为一个一个小的模块保存起来,反过来就是通过模块组装,拼出完整的代码。
不采用模块化,就是统一把所有代码写到一个文件里面。采用的话就是把程序分写进很多文件里面。
之所以会用到模块化,一个是因为方便多人开发,避免写一个里面会产生混乱和错误以及接续性不好等状况;一个是方便维护,防止多人各自修改产生分歧和错误;再一个是模块可以复用灵活拼接,这样就避免了相同的地方重复书写,提高效率,更加简洁。
在Python当中,一个py文件就是一个模块。不过要注意,模块的名字要符合标识符规范。
模块的创建
在一个文件里面写代码的时候,如果想引用其他模块,那把其他文件拖过来肯定是不行的,需要使用引用命令进行使用。语法: import 模块名(模块名指的是.py前面的内容)。比如文件名叫lianxi.py,那引用这个模块的时候就需要输入import lianxi(注意不写.py)。
现在创建一个叫module1.py的文件,里面输入print(‘haihaihai’)一句,然后打开lianxi.py文件,输入:
import module1
可以看到
haihaihai
不过注意,只能引用一次模块,引用多了也只执行一次,换言之引用一次就够了。
如果模块名太长了,可以设置别名。语法是 import 模块名 as 模块别名。要注意下面进行相关操作的时候,也要用别名。
import module1 as m1
print(m1)
haihaihai
<module 'module1' from 'D:\\4classcode\\4classcode\\module1.py'>
另外,import命令可以在程序的任意位置调用,但是大多用在开头,所有引用模块都放在开头方便用户得知完整模块引用情况。
在每一个模块内部都有一个**(双下划线)name(双下划线)**属性,通过这个属性可以获取到模块的名字。
module1.py里面写上:
print(__name__)
运行lianxi.py:
import module1 as m1
module1
或者在lianxi.py里面直接:
import module1 as m1
print(m1.__name__)
module1
(双下划线)name(双下划线)属性值为**(双下划线)main(双下划线)的模块是主模块**,直接执行谁,谁就是主模块。直接运行lianxi.py:
import module1 as m1
print(__name__)
__main__
模块的使用
想发挥模块的作用,需要在模块里面引入一些直接命令之外的对象,比如变量和函数等。
在module1文件中写入:
a = 21
b = 17
然后在lianxi.py中写入:
import module1 as m1
print(m1.a)
print(m1.b)
运行lianxi.py,得到:
21
17
可以看到,访问的方法就是 模块名.变量名。对于函数,也是同理 模块名.函数:
在module1文件中写入:
def han():
print('m1的函数')
然后在lianxi.py中写入:
import module1 as m1
m1.han()
运行lianxi.py得到:
m1的函数
同样,定义类也可以:
在module1文件中写入:
class Lei():
def __init__(self,name):
self._name = name
然后在lianxi.py中写入:
import module1 as m1
l = m1.Lei('lks')
print(l._name)
运行lianxi.py得到:
lks
上面是基于完整模块并使用的方法,当然,也可以只引用模块里面的一部分内容,语法是:from 模块名 import 变量,函数,类等。
from module1 import han
han()
m1的函数
当然,没有写入的对象就不能用。不过当写成from 模块名 import 星号的时候,就会引入模块里面所有的对象,不过要注意不要发生模块里面的对象和主程序里面对象重名的情况。
模块可以起别名,同理,引入的对象也能用别名,from 模块名 import 变量 as 别名即可。
from module1 import Lei as L
l = L('lks')
print(l._name)
lks
如果用了import星号,又有变量不想在主程序里面使用,那在模块里面的变量名前面加一个下划线就行。
from module1 import *
print(_a)
Traceback (most recent call last):
File "D:/4classcode/4classcode/lianxi.py", line 906, in <module>
print(_a)
NameError: name '_a' is not defined
这样就把变量变成仅模块内访问的了。
另外,当一些内容,比如测试函数,想要只在这个文件当主程序的时候运行,当模块的时候不运行。就可以用之前学到的(双下划线)name(双下划线)写一个判断语句来实现上述功能。
本来写在module1文件中:
han() # 测试函数
结果运行lianxi.py得到:
from module1 import *
m1的函数
但是在module1文件中写成:
if __name__ == '__main__':
han()
同样在lianxi.py里面运行:
from module1 import *
结果得到:
也就是没有运行han()函数。