码迷,mamicode.com
首页 > 编程语言 > 详细

Python之模块和包

时间:2018-03-19 21:23:03      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:from   划线   path   code   否则   bsp   清除   one   lang   

一、模块

1.什么是模块?

常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

   但其实import加载的模块分为四个通用类别: 

  1 使用python编写的代码(.py文件)

  2 已被编译为共享库或DLL的C或C++扩展

  3 包好一组模块的包

  4 使用C编写并链接到python解释器的内置模块

2.何要使用模块?

如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中。

使用模块可以提高代码的可维护性和重复使用,还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,所以编写自己的模块时,不必考虑名字会与其他模块冲突,但要注意尽量不要与内置函数名字冲突。

3.模块的导入方式

1.直接导入  import module 

这里有个大前提,就是你的py执行文件和模块同属于同个目录(父级目录),如下图:

技术分享图片

  • main.py 和 pwcong模块同在python目录
  • 执行文件为main.py
  • pwcong文件夹为一个模块

我把pwcong模块提供的函数写在 __init__.py 里,里面只提供一个 hi 函数:

# pwcong 模块的 __init__.py
# -*- coding: utf-8 -*-

def hi():
    print("hi")

执行文件main.py直接import模块:

# main.py
# -*- coding: utf-8 -*-

import pwcong

pwcong.hi()

接着我们运行一下main.py可以看到命令行窗口输出了一句 hi ,第一种方式完成。

使用模块方式为:先导入-》接着输入模块.变量|函数, 如上面例子的 pwcong.hi()

 

如果要同时导入多个模块,只需要在模块名之前用逗号进行分隔:

import module1,module2,module3.......

在用import语句导入模块时最好按照以下的顺序:

1、python 标准库模块
2、python 第三方模块
3、自定义模块

 

 

2.import... as...

import 引入模块格式如下:

import 模块路径.文件名 as 别名

释:当文件在当前目录下或PATH环境变量下,可以直接import 文件名;否则要从项目根目录下开始指定路径。别名,直接引入文件名可以不用别名,如果带模块路径引入最好加上别名,使用时直接 【别名. 】使用。

二、from ... import ...

from ... import ... 这种引入方式使用一个点号来标识引入类库的精确位置。

格式:

import 模块路径.文件名 import 变量名\函数\类名

from module import xx

from
module import xx as rename

from module import *  
把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,
因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
*如果module.py中的名字前加_,即_money,则from module import *,则_money不能被导入

也支持导入多行
 from my_module import (read1,
                    read2,
                    money)

注意:win系统不要使用相对路径。

 

模块的加载与修改

考虑到性能的原因,每个模块只被导入一次,放入字典sys.modules中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块,

有的同学可能会想到直接从sys.modules中删除一个模块不就可以卸载了吗,注意了,你删了sys.modules中的模块对象仍然可能被其他程序的组件所引用,因而不会被清除。

特别的对于我们引用了这个模块中的一个类,用这个类产生了很多对象,因而这些对象都有关于这个模块的引用。

如果只是你想交互测试的一个模块,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),这只能用于测试环境。

技术分享图片
def func1():
    print(func1)
aa.py
技术分享图片
import time,importlib
import aa
 
time.sleep(20)
# importlib.reload(aa)
aa.func1()
测试代码

在20秒的等待时间里,修改aa.py中func1的内容,等待test.py的结果。

打开importlib注释,重新测试

把模块当做脚本执行 

 

Python之模块和包

标签:from   划线   path   code   否则   bsp   清除   one   lang   

原文地址:https://www.cnblogs.com/strive-man/p/8604802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!