day024认识模块的语法,import, from xxx import xxx

本节内容:

1.认识模块
2.import
3.from xxx import xxx

一、什么是模块

模块可以认为是一个py文件. 模块实际上是我们的py文件运行后的名称空间

1、我们import加载的模块⼀共分成四个通⽤类别:

1. 使⽤pyhton编写的py⽂件(常用)
2. 已被编译为共享库或者DLL或C或者C++的扩展
3. 包好⼀组模块的包.(常用)
4. 使⽤c编写并连接到python解释器的内置模块

2、为什么要使⽤模块?

为了我们写的代码可以重⽤. 不⾄于把所有的代码都写在⼀个⽂件内.
当项⽬规模比较⼩的时候. 完全可以使⽤⼀个py搞定整个项⽬的开发.
但是如果是⼀个⾮常庞⼤的项⽬. 此时就必须要把相关的功能进⾏分离.
⽅便我们的⽇常维护. 以及新项⽬的开发

二、import

import random  #  一次性把模块所有内容导入
from random import randint # 把模块加载。 导入randint

import 模块名
模块名.属性/方法/类

每个模块都有自己的独立的名称空间,每个都有一个global, 互相并不影响
模块.属性 = 值. # 不要这么干

1、导入模块时会系统会自动执行的三个操作

1. 先去 sys.modules 查看当前模块是否已经被导入
    如果该模块已经导入,则不会重复导入
2. 开辟一段内存空间, 在该空间中执行该模块的代码
3. 给该空间一个名称,把这个名称引入当前模块

2、在当前模块,对导入的模块的一些操作

1.使用模块名可以直接访问模块的内容
2.global升华一个变量只在自己的模块有用
3. __name__ 可以屏蔽引入模块的测试代码
   __name__ 如果该模块是启动模块,值是:__main__
         如果该模块是被引入的,值是:模块名
4.用模块名.变量/方法/函数/类,可以改变导入的模块里面的内容,yitian.main_person_man = "灭绝" # 一般不要这么干

3、if name == “main“: 的使用

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

fe: 在其中一个模块修改,引用的同一个模块

⾦庸:
import yitian
yitian.main_person_man = "灭绝师太"

⾦庸⼆号:
import yitian
import ⾦庸
print(yitian.main_person_man) # 灭绝师太.

上述问题出现的原因:
 1. ⼤家共享同⼀个模块的名称空间.
 2. 在⾦庸⾥改变了主⻆的名字

# 如何解决
if __name__ == '__main__':
    yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为⼊⼝运⾏的时候才会把main_person_man设置成灭绝师太

    print("哇哈哈哈哈哈") # 只有运⾏该模块才会打印. import的时候是不会执⾏这⾥的代码的

4、我们还可以对导入的模块进⾏重新命名:

import yitian as yt # 导⼊yitian. 但是名字被重新命名成了yt. 就好⽐变量赋值⼀样.

a = 1 b = a
yt.fight_in_shaolin() # 此时可以正常运⾏
# yitian.fight_in_shaolin() # 此时程序报错. 因为引⼊的yitian被重命名成了yt

print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at
0x103209438>, '__spec__': None, '__annotations__': {}, '__builtins__':
<module 'builtins' (built-in)>, '__file__':
'/Users/sylar/PycharmProjects/oldboy/模块/模块/⾦庸.py', '__cached__': None,
'yt': <module 'yitian' from '/Users/sylar/PycharmProjects/oldboy/模块/模
块/yitian.py'>}

5、一次引入多个模块

import time, random, json, yitian

6、正确的导入模块的顺序:

1. 所有的模块导入都要写在最上⾯. 这是最基本的
2. 先引入内置模块
3. 再引入扩展模块
4. 最后引入你⾃⼰定义的模块

三、from xxx import xxx

确定自己要用什么,使用这种方法
from 模块 import 函数/变量
当作自己的变量或者函数来使用

from xxx import *  导入所有(尽量不要这样导入,如果被导入的模块写__all__的话,就只会导入__all__里面的内容,其他内容不导入)
导入的内容都可以起别名  as

1、一些用法

import random # 当你不确定你要用到什么
from random import randint  # 当你确定你要用到的东西

from urllib.request import urlopen # 导入单个
urlopen(url)


from collections import Iterable, Iterator  # 导入多个内容
from abc import ABCMeta, abstractmethod
print(globals())
print(randint(1,10))

from yitian import main_person_man as nanzhujue # 对导入的内容重命名

2、两个小坑

fe1:如果当前⽂件中出现了重名的变量时. 会覆盖掉模块引入的那个变量.

from yitian import main_person_man  # 原模块的为:main_person_man = "张无忌"

main_person_man = "超级⼤灭绝" # 引入的模块中有这个变量名,会被覆盖掉
print(main_person_man)  # 打印为:超级⼤灭绝

fe2: 自己的py文件,跟内置的模块,第三方模块同名

我们⾃⼰创建的py⽂件的名字不要和系统内置的模块重名.

否则,引入的很有可能是自己,写的py文件,程序根本跑不动!!!

posted @ 2018-11-19 16:50  一片疏影  阅读(152)  评论(0编辑  收藏  举报