4.模块和包

1.模块

模块是一个包含了python定义和声明的文件,文件名就是在名字上加.py后缀,import加载模块分为四个通用类别

1.使用python编写的py文件

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

3.包好一组模块的包

4.使用c编写并连接到python解释器的内置模块

导入模块的两种方式

 1.import 模块

  2.from xxx import xxx

inport模块

创建yitian.py文件

main_person_main = "张无忌"
main_person_woman = "赵敏"

low_person_man_one = "成昆"
low_person_woman_tow = "周芷若"


def firght_on_light_top():
    print(f"光明顶大战,{main_person_main}破坏了{low_person_man_one}阴谋")

def firgh_on_shaolin():
    print(f"少林大战,{main_person_main}打败了{low_person_woman_tow}")

def end():
    print(f"{main_person_main}和{main_person_woman}过上了幸福的生活")

创建jinyong.py文件 

import yitian as yt#起别名

# yt.gai()
print(yt.main_person_main) #使用模块中定义好的名字
print(yt.main_person_woman)

yt.firght_on_light_top()#调用模块中的函数
yt.end()

 在python中重复导入模块,系统会根据sys.modules来判断是否已经导入了如果导入了就不会重复导入

import sys
print(sys.modules.keys()) #查看导入的模块

import yitian #导入模块,此时会默认执行模块中的代码
import yitian# 该模块已经导入过了,不会重复执行代码
import yitian
import yitian

如果模块没有导入,系统会做三件事

  1.为导入的模块创立新的名称空间

  2.在新创建的名称空间中运行该模块的代码

  3.创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字 

global指向的是模块内部,并不是改变外部模块的内容

 特别特别要注意.  如果我们在不同的模块中引入了同一个模块. 并且在某一个模块中改 变了被引入模块中的全局变量. 则其他模块看到的值也跟着边. 原因是python的模块只会引入 一次. 大家共享同一个名称空间 

__name__查看当前模块名字

在当前运行是该文件__name__是__main__

在别人导入的时候不执行测试代就可以用if __name__ == '__main__':

正确导入模块的顺序:

   1.所有模块导入都要写在上面

   2.先引入内置模块

   3.再引入扩展模块

   4.最后引入自定义的模块

from的坑

当我们从一个模块中引入一个变量的时候. 如果当前文件中出现 了重名的变量时. 会覆盖掉模块引入的那个变量量.

注意:

 我们自己创建的py文件的名字不要和系统内 置的模块重名. 否则. 引入的模块都是python内置的模块. 

特殊写法:from xxx import * 把所有模块中的内容加载出来,如果写了__all__ 初识导入的内容是在 __all__列表中列出来的所有名字

#haha.py

__all__ = ["money","chi"]
money = 100
def chi():
    print("我是吃了")

def he():
    print("呵呵")

#test.py
from haha import *

chi()
print(money)
he() #报错

 二.包

   包是一种通过'.模块名'来组织python模块名称空间的方式

python2中必须要有__init__.py文件才能算包,包是一种形式,包的本质就是一种模块

先创建一下文件

import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)

目录文件如下

包的注意事项:

1. 关于包相关的导入语句句也分为import和from xxx import xxx两种, 但无论使用哪种, 无论在什么位置, 在导入时都必须遵循一个原则: 凡是在导入时d带点的. 点左边都必须是一个包. 否则报错. 可以带一连串的点. 比如a.b.c

2. import导入文件时. 产生名称空间中的名字来源于文件, import 包, 产生的名称空间中的名字同样来源于文件, 即包下的__init__,py, 导入包本质就是在导入该文件

3. 包A和包B下有同名模块也不会冲突, 如A.a和B.a来自两个名称空间

  

posted @ 2019-02-24 14:55  等待の喵  阅读(308)  评论(0编辑  收藏  举报