在我们实际开发的过程中,每个项目都会或多或少的调用一些相同的代码。如果每次都把代码复制粘贴进项目的话,非常的繁琐,且容易出错,python模块很好的为我们解决了这个问题。python的模块是以 .py 结尾的,而我们的python程序也是以 .py 结尾的,所以,python所有的代码都可以看作为模块。
模块的好处是,可以调用自定义的模块,也可以调用别人成熟的模块。在程序需要的时候,使用 import 导入就可以直接使用了,非常的方便快捷。我们先来看看模块的定义。
# 实例1,我们用实例来解释模块的定义,新建m1.py
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
"这里是模块的说明"
__author__="PyShadow"
b1='hello python'
b2=666
b3=True
def func(x,y):
return 'x * y = {0} '.format(x*y)
def func1():
return '666'
# 第一行表示该程序可以在Unix/Linux/Mac直接运行
# 第二行表示采用utf-8编码
# 接下来的字符串表示模块的说明
# __author__代表的是编写该模块的作者
# 接下来的就是模块的代码,定义了b1,b2,b3三个变量,且定义了func函数
# 调用模块
import Modulename
#调用模块的函数
Modulename.functionname
# 调用模块的变量
Modulename.varname
# 实例2,我们新建一个test.py文件,以此来调用 m1.py (实例1的代码)
import m1
print(m1.b1)
print(m1.b2)
print(m1.b3)
print(m1.func(2,3))
>>>
hello python
666
True
x * y = 6
# 导入模块m1,调用m1的变量以及函数
你会问了,如果出现一个和自定义模块名称相同的第三方模块,我们该怎么办呢?这里我们引入一个“包”Package。包就是模块的集合,包可以容许有相同名称的模块。
# 如上图所示,包 w1 和 test.py 在同一目录下,w2 和 m1.py 、__init__.py 在同一目录下,w2 目录中有 m1.py 和 __init__.py。如果包里面没有__init__.py文件,则认为是普通目录。我们把各个文件的代码贴上来。__init__.py可以是空文件。
# w1/m1.py 的代码
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
'注释'
__author__="Shadow"
def func1():
return 'hello python'
def func2(x,y):
return 'x * y = {0}'.format(x*y)
# w1/w2/m1.py 的代码
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
"注释"
__author__="Shadow"
def func():
return "hello world"
# test.py 的代码
import w1.m1
print(w1.m1.func1())
print(w1.m1.func2(2,3))
print("*"*15)
import w1.w2.m1
print(w1.w2.m1.func())
>>>
hello python
x * y = 6
***************
hello world
# 虽然两个自定义模块的文件名是一样的,但是,加入到包里,就不会出现重复的情况了。
# 包的调用方法为,包.文件名;调用模块的函数,包.文件名.函数名;调用模块的变量,包.文件名.变量。
当我们调用的模块代码比较多,但我们只用其中的某一个函数的时候,使用上述的代码会把模块中的变量、函数、类等都引入进来,造成了不必要的资源浪费。这里说一下部分引入的概念,部分引入就是只引入我们需要的某些函数或者类,语法如下:
from module import xxx
# 实例1
from w1.m1 import func2
print(func2(2,3))
>>> 6
# 这里引入了 w1.m1 模块中的函数 func2 。使用这种部分引入后,我们在调用函数的时候,可以直接使用函数名称。
我们也可以给模块定义一个别名(也就是简称),方便调用。
import module as xxx
# 实例2
import w1.w2.m1 as m
print(m.func())
>>> hello world
# 我们把 w1.w2.m1 别名定义为 m,在调用的时候,直接使用 m 就可以调用。
接着,我们来说说模块的定义域。定义模块的时候,有些变量或者函数我们想给调用者用,有些不想给用。我们可以给变量或者函数前面加“_”或者“__”来告诉使用者,这些变量和模块是不能调用的。"__author__" 是输入特殊变量。
虽然我们说这些不能调用,但是python没有机制来限制被调用。也就是大家约定俗成的,但是并没有什么x用。我们来看看实例:
# 实例1,定义和 test.py 同级别的模块 m2.py
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
"注释"
__author__="Shadow"
_a='func1'
_b='func2'
c='hello world'
def _func1():
return _a
def _func2():
return _b
def func(n):
if n==1:
return _func1()
else:
return _func2()
# 以"_"开头的都是非公开的,其他的为公开的。
# 实例2,修改test.py文件
import m2
print(m2.c)
print(m2.func(1))
>>>
hello world
func1
# 我们调用的是公开函数和公开变量
关注公众号,了解更多!