day23 模块

1.  模块
   1. 首先,我们先看个老生常谈的问题. 什么是模块. 模块就是一个包含了python定义和声
   明的文件, 文件名就是模块的名字加上.py后缀. 换句话说我们目前写的所有的py文件都可以
   看成是一个模块但是我们import加载的模块一共分成四个通用类别:
    1. 使用pyhton编写的py文件
    2. 已被变异为共享库或者DLL或C或者C++的扩展
    3. 包好一组模块的包.
    4. 使用c编写并连接到python解释器的内置模块

  2. 为什么要使用模块
  为了我们写的代码可以重复利用,不至于把所有的代码都行写在一个文件内;对于大项目可以进行功能分离
  方便我们日常的维护及新项目的开发.

  3. 调用模块的方式
    1. import XXXXX
    2. from XXX import XXXX
2.  import

#创建模块 yitian
print("啊啊啊啊啊啊啊啊啊啊啊啊啊...............")
mian_person_man="张无忌"
mian_person_women="赵敏"

bad_person_one="周芷若"
bad_person_two="成昆"

def fight_shao_lin():
    print("在少林%s粉碎了%s的阴谋"%(mian_person_man,bad_person_two))
print("哦哦哦哦哦哦哦哦哦哦哦哦哦哦...................")

例. 1
#打开 jinyong文件
import yitian #导入yitian模块 在导入模块会把模块先运行一次,所以片头曲片尾曲会被先打印出来
print(yitian.mian_person_man) # 使用模块中定义好的名字
print(yitian.bad_preson_one) #张无忌 周芷若

yitian.fight_in_shaolin() # 调用模块中的函数
yitian.fight_on_light_top()
在导入某块的时候,解释器会做几件事:
1. 通过sys.modules来判断模块是否已经导入过,导入过就不会重复导入
  说白了,就是统同一模块只会被导入一次
2. 如果模块还没有被导入过,则系统会为他在内存开辟一块名称空间
3. 在他的名称空间中运行该模块中的代码
4. 创建模块的名字,并使用名称作为模块在当前模块中引用的名字

--------------------------------------------------------
例 .2
import yitian
mian_person_man = "胡一菲"
def fight_in_shaolin():
  print(mian_person_man, "大战曾小贤")

print(yitian.main_person_man) # 张无忌
print(mian_person_man) # 胡一菲

yitian.fight_in_shaolin() # yitian模块的
fight_in_shaolin() # 自己的
注意. 由于模块在入的时候会建其自己的名称. 所以. 我们在使用模块中的
的时候一般般是不会产生冲突

--------------------------------------------------------------------
例 .3
模块 yitian :
print("片头曲. ! ~ ! . 啊啊啊啊啊啊啊...")
main_person_man = "张无忌"
main_person_woman = "赵敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
def fight_on_light_top():
  print("光明顶大战", main_person_man, "破坏了", low_person_man_one, "的⼤阴
")
def fight_in_shaolin():
  global low_person_man_two # 注意看, 此时的global是当前模块. 并不会影响
其他模块
  low_person_man_two = "战五渣"
print("少林寺⼤战", main_person_man, "破坏了", low_person_man_two, "的⼤阴
"
)


调用方:
import yitian
low_person_man_two = "刘海柱"
yitian.fight_in_shaolin() print(yitian.low_person_man_two) # 战五渣
print(low_person_man_two) # 刘海柱. 并没有改变当前模块中的内容. 所以模块内部的
global只是用于模块内部


在模块中使用global. 我们之前说global表示把全的内容入到. 但是. 这个
局指的是py文件. 换句话说. global指向的是模块内部. 并不会改变外部模块的内容

这边要说明的就一个,在一个py文件中global的作用域就是当前文件,不会延伸到调用或者被调用的的模块中
----------------------------------------------------------------------------------
要注意. 如果我们在不同的模块中入了同一个模块. 并且在某一个模块中改
了被入模块中的全局变. 则其他模块看到的跟着边. 原因python的模块只会
一次. 大家家共享一个名称例 .4
金庸:
import yitian
yitian.main_person_man = "灭绝师太"

金庸二号:
import yitian
import 金
print(yitian.main_person_man) # 灭绝师太.
都引用了yitian,都是金庸把一天中的
main_person_man改变了,金庸二引用了该模块,其
main_person_man的值也会跟着改变
#那这个问题如何改变呢

--------------------------------------------------------------
此时, 我们就要利用一下__name__
这个内置变量了. Python. 个模块都有自己__name__ 但是这个__name__是不
定的. 当我们把一个模块作为程序运行的入口. 此时模块的__name__"__main__" , 而
如果我们把模块入时. 此时模块内部的__name__就是模块文件的名字.5
金庸:
print(__name__)
# 此时如果运行该文件. __name____main__

金庸二号:
import 金
#此时打印的结果是"金"

我们可以利用这个特性来控制模块内些代码是在被加的时候就运行. 些是在模
块被别人导入的时候就要执行. 也可以屏蔽掉那些不希望别人导入就运行的代码. 尤其是测
试代码 if __name__ == '__main__':
yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为入运行的时候
会把main_person_man设置成灭绝师太

print("哇哈哈哈哈哈") # 只有运行该模块才会打印. import的时候是不会执行这些的代
码的
这边不是很好理解,要重点看一下

-----------------------------------------------------------------------
我们还可以对入的模块进行重新:
import yitian as yt # 导⼊yitian. 但是名字被重新命名成了yt. 就好比变量赋值⼀样.
a = 1 b = a
yt.fight_in_shaolin() # 此时可以正常运行
# yitian.fight_in_shaolin() # 此时程序报错. 因为引用的yitian被重命名成了yt

也可以一次引用多个模块
import time, random, json, yitian
入模块的:
1. 所有的模块入都要写在上面. 这是基本的
2. 入内模块
3. 扩展模块
4. 入你自己
定义的模块

 

3.  关于 from xxx import xxx
接下来. 我们来看from xxx import xxx这种入模块的
效果. 在使用from的时候, python也会我们的模块建名称. 这一点和import是一样
. 但是from xxx import xxx的时候. 我们是把这个间中的一些入过来了. 说白了.
是部分. 当一个模块中的内容过多的时候. 我们可以选择性的入要使用的内容
例.
from yitian import fight_in_shaolin, fight_on_light_top, main_person_man
fight_in_shaolin()
fight_on_light_top()
print(main_person_man)
. 看一下from的坑. 当我们从一个模块中入多个量的时候. 如果当前文中出现
了重名的量时. 覆盖掉模块入的那个.
from yitian import main_person_man
main_person_man = "超级大灭绝"
print(main_person_man) #超级大灭绝


所以. 不要重名. 切记. 不要重名! 仅仅量名不要重复.我们自己
创建的py文件的名字不要和系统内
置的模块重名. . 入的模块都是python的模块. 切记, 切记.


 

posted @ 2018-11-19 15:48  阿布_alone  阅读(223)  评论(0编辑  收藏  举报
TOP