python高级-模块(14)

一、python中的模块

有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的。

那么在Python中,如果要引用一些其他的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

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

模块的概念:

  • 每一个以扩展名py结尾的python源代码文件都是一个模块
  • 模块名同样也是一个标识符,需要符合标识符的命名规范
  • 在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
  • 模块就好比工具包,要想使用这个工具包中的工具,就需要先导入这个模块

二、import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

import导入

import 模块名1,模块名2 #不推荐

说明:在导入模块时,每个导入应该独占一行(推荐)

import 模块1
import 模块2

导入之后

通过模块名使用模块提供的工具---全局变量、函数、类

只用as指定模块的别名

如果模块的名字太长,可以使用as指定模块的别名,以方便在代码中的使用

import 模块名1 as 模块别名

注意:模块别名应该符合托峰值命名规范

为什么要加上模块名呢?

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

三、from … import

from...import导入

  • 如果想从某一模块中导入部分工具,就可以使用from...import的方式
  • import模块名是一次性把模块中所有的工具全部导入,并且通过模块名/别名访问
#从模块中导入某一个工具
from 模块名 import 工具名#可以通过as为工具指定别名

导入之后

  • 不需要通过模块名. 的方式使用模块提供的工具
  • 可以直接使用模块提供的工具  --- 全局变量、函数、类

注意:

  • 如果两个模块,存在同名的函数,name后导入模块的函数会覆盖先导入的函数
  • 开发时import代码应该统一写在代码的顶部,更容易及时发现冲突
  • 一定大仙冲突,可以使用as关键字,给其中一个工具起一个别名

from...import *

#从模块中导入所有工具
from 模块名 import *

注意:

这种法师不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查

案例:

demo.py(自定义的模块)

#全局变量
title = "模块1"

#函数
def say_hello():
    print("我是%s"%title)

#类
class Dog(object):
    pass

#类
class Cat(object):
    pass

test.py中使用demo.py模块

#导入模块中的所有工具,同时为模块指定别名为myTest
import demo as myTest
#导入模块中所有工具,不推荐,工具同名不好排查
#from...import * 
#from...import导入模块中的部分工具(Dog类)
from demo import Dog
#为导入工具Cat类指定别名Test_Cat,防止与其他模块中工具重名
from demo import Cat as Test_Cat

myTest.say_hello()
dog=Dog()
cat=Test_Cat()

四、python模块导入的搜索路径

  • 程序的主目录
  • PTYHONPATH目录(如果已经进行了设置)
  • 标准连接库目录(一般在/usr/local/lib/python2.X/)
  • 任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去 .pth后缀的文本文件中一行一行的地列出目录。
  • 这四个组建组合起来就变成了sys.path了,
  • 当python import模块的时候,就通过sys.path里面的目录列表下面去查找。
  • sys.path是python的搜索模块的路径集,是一个list。
  • 查看sys.path方法:
import sys
print(sys.path)
['C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 
'C:\\Program Files\\Python37\\python37.zip', 
'C:\\Program Files\\Python37\\DLLs', 
'C:\\Program Files\\Python37\\lib', 
'C:\\Program Files\\Python37', 
'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 
'C:\\Program Files\\Python37\\lib\\site-packages']

程序执行时导入模块路径

import sys
#因为sys.path是一个列表,所以可以在后面追加一个自定的模块路径
sys.path.append("/home/Se7eN_HOU")
#通过insert可以将路径插到前面
sys.path.insert(0,"Home/Se7eN")
print(sys.path)

运行结果为:

['Home/Se7eN', 
'C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 
'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 
'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 
'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 
'C:\\Program Files\\Python37\\lib\\site-packages', 
'/home/Se7eN_HOU']

五、模块制作

1、定义自己的模块

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

比如有这样一个文件test.py,在test.py中定义了函数add

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

2、调用自己的模块

那么在demo.py文件中就可以先import test,然后通过test.add(a,b)来调用了,当然也可以通过from test import add来引入

import test
result = test.add(1,2)
print(result)

运行结果为:3

3、测试模块

在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:test.py文件

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

#用来测试
ret = add(11,22)
print("in test.py 测试11+22 = %d"%ret)

如果此时,在demo.py文件中引入了此文件的话,想想看,测试的那段代码是否也会执行呢!

import test
result = test.add(1,2)
print(result)

运行结果为:

in test.py 测试11+22 = 33
3

至此,可发现test.py中的测试代码,应该是单独执行test.py文件时才应该执行的,不应该是其他的文件中引用而执行。为了解决这个问题,python在执行一个文件时有个变量__name__

test.py文件中:

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

#用来测试
#ret = add(11,22)
#print("in test.py 测试11+22 = %d"%ret)
print("in test.py,__name__ is %s"%__name__)

运行结果为:

in test.py,__name__ is __main__

在demo.py文件中导入test.py模块运行为

import test
result = test.add(1,2)
print(result)

运行结果为:

in test.py,__name__ is test
3

可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码

test.py模块中代码改为:

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

if __name__ == "__main__":
    ret = add(11,22)
    print("in test.py 测试11+22 = %d"%ret)

在test.py中运行结果为:

in test.py 测试11+22 = 33

在demo.py中导入test.py模块

import test
result = test.add(1,2)
print(result)

运行结果为:3

这样我们在开中测试的代码,就不会在其他模块中出现了。

六、模块中的_ _all_ _

1、没有_ _all_ _

test.py模块

class Test(object):
    def test(self):
        print("---Test类中的test方法---")

def test1():
    print("---test1方法---")

def test2():
    print("---test2方法---")

在demo.py中导入test.py模块

from test import *
a = Test()
a.test()
test1()
test2() 

运行结果为:

---Test类中的test方法---
---test1方法---
---test2方法---

2、模块中有_ _all_ _

test.py模块

__all__ = ["Test","test1"]
class Test(object):
    def test(self):
        print("---Test类中的test方法---")

def test1():
    print("---test1方法---")

def test2():
    print("---test2方法---")

demo.py模块

from test import *
a = Test()
a.test()
test1()
test2() 

运行结果为:

---Test类中的test方法---Traceback (most recent call last):

---test1方法---
  File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 5, in <module>
    test2() 
NameError: name 'test2' is not defined

如果一个文件中有__all__变量,那么也就意味着只有这个变量中的元素,才会被from xxx import *时导入

猜你喜欢

转载自blog.csdn.net/c710473510/article/details/89311181