函数 -- 模块和包

2019-01-07  本文已影响0人  __深蓝__
  • 模块就象工具包,要想使用工具包中的工具,就需要导入(import)这个模块
  • 每个以.py 结尾的 Python 源代码文件都是一个模块
  • 在模块中定义的全局变量函数都是模块能够提供给外界直接使用的工具
import 导入
import 模块名1 [ ,模块名2 [ , ...模块名n ]
# 新建 py_model1.py
name = '东软睿道'
def sayhello():
    print('hello')
name = 'zhang3'

# 新建 py_model_test1.py
import py_model1
py_model1.sayhello()
print(mode1.name)

hello
zhang3
  • 在一个Python文件中定义的 变量函数,可以在另一个文件中用import导入这个模块。
  • 导入之后,就可以使用模块名.变量模块名.函数() 的方式,使用模块中定义的变量或者函数
  • 模块的作用是,实现代码复用!
import 模块名 as 模块别名
  • 如果模块名太长,可以使用 as 指定模块的别名
  • 如果指定了别名,就不能再使用原来的模块名
from...import 导入
  • import一次性把模块中所有的函数和变量都导入当前文件
  • 如果希望从模块中导入部分工具,可以使用 from ... import方式
from 模块名 import 函数 [, 类 [, ...变量 ] ]  [as 别名]
  • 这种方式导入之后,可以直接使用模块中定义的函数变量
# 新建 py_model_test2.py
from py_model1 import sayhello
from py_model1 import name
sayhello()
print(name)
hello
zhang3
  • 如果两个模块中存在同名函数,那么后导入的函数会覆盖之前的函数
  • 通常将import写在文件开始,之样更容易发现冲突,如果冲突不可避免,可以使用as关键字进行重命名
from...import * 导入
from 模块名 import *
  • 导入模块中所有的函数和变量
  • 这种方式不推荐使用,容易造成函数重名,并且没有提示
模块搜索顺序
  • Python解释器在导入模块时,会先搜索当前目录,如果有就直接导入;如果没有,再搜索系统目录
  • 文件命名不要和系统的模块文件重名
  • 每一个模块都有一个内置属性__file__可以查看模块的绝对路径
隐藏模块中的内容
  • 导入文件时,任何没有缩进的代码都会被执行一遍!
# model1.py
print("model")
# testmodel1.py
import model1
运行testmodel1会输出
model
  • __name__属性中保存着一个字符串,其值在当前模块中为__main__,导入其它模块时为模块名
  • 利用if语句判断__name__的值是否为__main__,使代码只在当前模块内执行
  • 这种if语句形式相当于其它语言中的main方法
if __name__ == "__main__":
    仅在当前文件使用的代码
  • 用来管理Python模块的命名空间,采用 包名.模块名 的形式来避免模块名重名,只要把模块放在不同的包中,就不用担心产生名字冲突。
  • 创建目录
  • 在目录中创建__init__.py文件,指定对外界提供的模块列表
  • 在目录中添加文件(模块)
目录结构
mycompany
    ├─ __init__.py
    ├─ abc.py
    └─ xyz.py
  • 引入以后,只要顶层包名不冲突,目录中的模块也不会冲突,因为模块abc的名字变成了mycompany.abc
  • 每个包目录下都有一个__init__.py文件,否则,系统会把这个目录当成普通目录
  • __init__.py文件用于指定对外界提供的模块列表
# __init__.py
from . import abc
from . import xyz
mycompany
   ├─ web
   │   ├─ __init__.py
   │   ├─ utils.py
   │   └─ www.py
   ├─ __init__.py
   ├─ utils.py
   ├─ abc.py
   └─ xyz.py
  • 文件www.py的模块名是mycompany.web.www
  • 两个utils.py文件的模块名分别是mycompany.web.utilsmycompany.utils
  • 自己创建的模块名,不能和Python自带的模块名冲突
从包中导入模块
import mycompany.web.utils  # 必须使用全名访问函数:mycompany.web.utils.func()

from mycompany.web import utils  # 导入子模块,使用模块名访问函数:utils.func()

from mycompany.web.utils import func  # 导入函数,直接访问函数:func()
  • 使用from package import item的形式导入,item可以是子包函数变量,可以直接使用导入的元素名访问
  • 使用import package.item的形式导入,item只能是子包模块,必须使用导入元素的全名访问




- end -

上一篇 下一篇

猜你喜欢

热点阅读