python 3 基础之模块的制作、导入

模块

一个项目里的各个单位由小到大:

变量(全局变量、局部变量、实例属性、类属性)——>函数方法(实例方法、类方法、静态方法)——>类——>模块——>包——>工程(项目)

1、模块是什么?

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字

说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块

要使用非本.py文件里的类、函数或者变量等,必须先用import关键字引入模块名称,然后才能调用(模块名.函数名)

2、模块的制作

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字

2.1、定义一个模块test.py

def test_sum(a,b):
    return a + b

调用自己定义的模块

import test
print(test.test_sum(3,4))

2.2、制作一个模块(正常代码、测试代码),if __name__ == ‘__main__‘

test.py

name = ‘制作模块‘
def add2num(a,b):
    return a + b
class Person(object):
    def eat(self):
        print(‘人会吃饭‘)

# 用来测试代码的函数(自测函数),一般命名main()
def main():
    print(name)

    ret = add2num(12,32)
    print(ret)

    p = Person()
    p.eat()

# 调用测试函数
if __name__ == ‘__main__‘:
    main()

创建一个测试模块ceshi.py调用test.py

import test
# 需要测试test模块,定义 一个本模块的测试函数
def main():
    print(test.name)
      ret = test.add2num(222,22)
    print(ret)

    p = test.Person()
    p.eat()

# 调用测试函数
if __name__ == ‘__main__‘:
    main()

解释:调用自测函数为什么不用main(),用if __name__ == ‘__main__‘

  一个模块的自测函数调用方式使用了:if __name__ == ‘__main__‘

  就会出现这样的情况:在本模块中可以正常调用自测函数,而在另外一个模块调用本模块时,自测函数不会运行(因为另外的模块不需要此自测函数,所以用这种方式)

  在同一个.py文件中,打印__name__结果均为__main__;把一个test.py文件的打印__name__的代码封装成函数,导入另外一个模块cesh.py使用,打印出来的结果是test.py的模块名字test

  

3、导入模块(关键字import)

如果一个模块被另一个模块导入后 就把这个模块里面可以执行的代码都执行一遍

3.1、python中使用import  关键字导入模块

导入模块格式:

import 模块名1,模块名2..........
# 实例:导入随机模块
import random

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。

3.2、调用非本模块的函数

  格式:模块名.函数名 

  调用非本模块的函数为何要加上模块名:

  会有一种情况:在多个模块中含有相同名称的函数,若只是通过函数名来调用,解释器不知道到底要调用哪个函数,会报错。所以如果像上述这样引入模块的时候,调用函数必须加上模块名

3.3、单独调用非本模块的某个函数

  此时只需要引入该函数即可:from.......import......

from 模块名 import 函数名1,函数名2....

  不仅可以引入函数,还可以引入一些全局变量、类等

  通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数

3.4、导入一个模块的所有东西(函数、变量、类)   

  from 模块名 import * 

  如果想一次性引入math中所有的东西,还可以通过from math import *来实现

from math import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

3.5、给导入的模块起别名  as

  格式:import 模块名 as 别名(在此模块只使用别名即可)

3.6、模块中的__all__变量使用(只有配合from 模块名 import*使用才有效)

  __all__也属于模块中的变量,如果一个模块用了__all__ = [‘变量1‘,‘变量2‘.....]

  若在某个模块中使用了__all__,那么只有在__all__的列表中的字符串(变量)才可以被其他模块调用

  要符合条件:其他模块必须是通过from 模块名 import* 方法导入的

如下test.py模块

test.py

# 条件 其他模块必须是通过from 模块名 import * 方式导入的模块
__all__ = ["name",‘add2num‘]

name = "加法运算"

def add2num(a, b):
    return a + b

def delnum(a,b):
    return a - b

ceshi.py

from test import *
# 可以正常调用
print(name)
print(add2num(33,8))

# 调用delnum函数失败
f = delnum(33,2)
print(f)

3.7、定位模块

  当你导入一个模块,Python解析器对模块位置的搜索顺序是:

    当前目录

    如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。

    如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

    模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

相关推荐