一、模块
 
模块就是一个包含了python定义和申明的文件,文件名就是模块的名字加上.py的后缀/
模块的分类:
    1、使用python编写的py文件
    2、已被编译位共享库或者DLL或C或者C++的扩展
    3、包好一组模块的包
    4、使用c编写并连接到python解释器的内置模块
 
使用模块是为了让我们写的代码可以重用,不至于把所有的文件都写到一个py文件内。如果都写在一个py文件内,项目大时,不易维护。
 
导入模块的两种方式
1、import模块
2、from XXX import XXXX
 
yitian.py
print('...................')

main_actor = '张无忌'
main_actress = '赵敏'
fan_main_actor = '成昆'
fan_main_actress = '周芷若' def light_war():
print(f"{main_actor}破坏了{fan_main_actor}的阴谋诡计") def shaolin_war():
print(f"{main_actor}打败了{fan_main_actress}") def ending():
print(f"{main_actor}和{fan_main_actress}幸福的在一起了") def change(name):
global main_actor
main_actor = name
print("..................."
金庸来了
jinyong.py
import sys
import yitian as yt # as 给模块重新命名# pycharm报错,模块路径有差异
# sys.path 搜索模块的路径
# print(sys.path)
# import yitian # 如果已经到如果该模块,此时则不会再执行模块中的代码了 print(yt.main_actor)
# print(main_actor) 报错 当前名称空间中没有main_actor yt.light_war()
yt.shaolin_war()
yt.ending()
导入模块后的流程:
 
1、在导入模块的开始,python解释器会先通过sys.modules 来判断爱模块是否已经导入了该模块,如果导入了,则不会再导入。如果该模块还未导入过,则系统会做三件事:
        1、为导入的模块创立新的名称空间
        2、在新创建的名称空间中运行该模块中的代码
        3、创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字(前提时没有as)
 
可以使用globals来查看模块的名称空间
print(globals())

结果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000172F298C1D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/python_workspace_hxt/day24 内置模块 re/yitian.py', '__cached__': None, 'main_actor': '张无忌', 'main_actress': '赵敏', 'fan_main_actor': '成昆', 'fan_main_actress': '周芷若', 'light_war': <function light_war at 0x00000172F2881E18>, 'shaolin_war': <function shaolin_war at 0x00000172F2BFA268>, 'ending': <function ending at 0x00000172F2BFA158>, 'change': <function change at 0x00000172F9C3A400>}

注: 由于模块在导入的时候会创建自己的名称空间,所以在使用模块中的变量的时候一般不会产生冲突

import yitian as yt

main_actor = '周游'
print(yt.main_actor) # 张无忌
print(main_actor) # 周游
特别注意:如果我们在不统的模块这种引入了同一个模块,并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的之也跟着变,原因是python的模块只会引入一次,大家共享一个名称空间
 
在yitian.py中添加如下代码
def change():
global fan_main_actress
fan_main_actress = '呵呵'

jingyong1.py

import yitian  as  yt
yt.fan_main_actress = '哈哈'

jingyong.py

import  yitian as  yt
import jingyong1 print(yt.fan_main_actress) # 哈哈
出现上述问题的原因
 
    1、大家同享一个模块的名称空间
     2、在jinyong1.py中改变了反角的名字
 
解决方案:
利用__name__这个内置变量,在python中,每个模块都有自己的__name__但是这个__name__的值是不定的。当我们把一个模块作为程序运行的人口时,此时该模块的__name__是“__main__”而如果我们把模块导入时,此时模块内部的__name__就是该模块自身的名字
 
在jinyong1.py
print(__name__)

# 结果为__main__

在jinyong.py中

import jinyong1

print(__name__)

结果为 jinyong1
 我们可以利用这个特性来控制模块内哪些代码是在被加载的时候就运行的,哪些时在模块被别人导入的时候就要执行的,也可以屏蔽掉一些不希望别人导入就运行的代码
 
if __name__=='__main__':
    yitian.main_actor = '张无忌'  # 此时,只有从该模块作为入口运行的时候才会把main_actor设置为张无忌
    print('张无忌其实是一个渣男')  # 只有运行该模块才会打印,import的时候是不会执行这里的代码的
 
我们还可以对导入的模块进行重命名
import yitian as yt  # 导入yitian,但是名字被重命名为yt,就好比变量赋值一样
a = 1 b = a yt.shaoli_war() # 此时可以正常运行 print(globals()) {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002CC30D7C1D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/python_workspace_hxt/day24 内置模块 re/practice24.py', '__cached__': None, 're': <module 're' from 'C:\\Users\\huxia\\AppData\\Local\\Programs\\Python\\Python36\\lib\\re.py'>, 'sys': <module 'sys' (built-in)>, 'yt': <module 'yitian' from 'F:\\python_workspace_hxt\\day24 内置模块 re\\yitian.py'>}

一次也可以导入多个模块

import time,random,json,yitian
正确的导入模块顺序:
 
    1、所有的模块导入都要写在最上面,基本
     2、先引入内置模块
     3、再引入扩展模块
     4、最后引入自己定义的模块
三、from  XXX  import  XXX
     在使用from的时候,python也会给我们的模块创建名称空间,这一点和import是一样的,但是from XXX import XXXX
的时候,只是把这个空间中的一些变量引入过来,部分导入。当一个模块中的内容过多的时候,可以选择性的导入要使用的内容。
  from的坑:当我们从一个模块中引入一个变量的时候,如果当前文件中出现了崇明的变量时,会覆盖掉模块引入的哪个变量。
所以要切记,不可以重名,不仅仅变量名不要重复,我们自己创建的py文件的名字不要和系统内置的模块重名,否则,引入的模块都是python内置的模块。
 
那有⼀种 特殊的写法: from xxx import *  我们说此时是把模块中的所有内容都导入.  注意, 如果模块中 没有写出__all__ 则默认所有内容都导入. 如果写了了__all__ 此时导入的内容就是在__all__列表 中列出来的所有名字

# haha.py
__all__ = ["money", "eat"]
money = 100
def eat():
print("我是吃")
def drink():
print("我是呵呵") # test.py
from haha import *
eat()
print(money)
drink() # 报错

25 Python之模块与包的更多相关文章

  1. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

  2. 一文搞懂 Python 的模块和包,在实战中的最佳实践

    最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...

  3. Python之模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  4. 《Python》模块和包

    一.模块 1.什么是模块: 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编写的代码(. ...

  5. Python之模块和包(Day21)

    一.Python模块 Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句. 模块让你能够有逻辑的组织你的Python代码段 把相关的代 ...

  6. python 深入模块和包

    模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...

  7. (Python )模块、包

    本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径.包等知识 1.模块 如果我们直接在解释器中编写python,当我们关掉解释器后,再进去.我们之前编写的代码都丢失了.因此,我们需要将我们 ...

  8. Python 基金会 —— 模块和包简介

    一.模块(Module) 1.模块的作用      在交互模式下输出的变量和函数定义,一旦终端重新启动后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Modul ...

  9. python基础-------模块与包(一)

    模块与包 Python中的py文件我们拿来调用的为之模块:主要有内置模块(Python解释器自带),第三方模块(别的开发者开发的),自定义模块. 目前我们学习的是内置模块与第三方模块. 通过impor ...

随机推荐

  1. Python将函数放入模块

    函数可以将通用的代码封装起来,便于其他程序或者方法调用.将函数存放在文件中,这个文件被称为模块.将函数存储在独立的模块中,可与其他程序员共享这些文件而不是整个程序. fun.py def say_hi ...

  2. JAVA静态数据的初始化;

    ①:Java首次会自动对变量进行初始化,其顺序优于构造器: ②:如果一个域是静态的的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值,如果它是一个对象引用,那么他的默认初始化值为n ...

  3. Log4J日志组件

    Log4j,  log for java, 开源的日志组件! 使用步骤: 1. 下载组件,引入jar文件; log4j-1.2.11.jar 2. 配置 :  src/log4j.properties ...

  4. Gradle DSL method not found: 'compile()'

    问题描述: 今天在导入第三方库的时候报错:Gradle DSL method not found: 'compile()' 通过网上查询发现是自己导包路径错误:应该导入app下面的build.grad ...

  5. axios的中文使用文档

    axios 基于promise用于浏览器和node.js的http客户端 原文链接 lewis1990@amoy 特点 支持浏览器和node.js 支持promise 能拦截请求和响应 能转换请求和响 ...

  6. linux之文件目录,输入及输出

    文件目录结构 ls 查看文件 ll 查看详细文件 文件和目录被组织成一颗倒置的树状结构 文件系统从根开始,'/' 文件名严格区分大小写 隐藏文件以.开头 文件的分隔符为'/' 文件命名规范 文件字符最 ...

  7. C语言基础:内置函数的调用

    #include<stdio.h>#include<math.h>#include<stdlib.h>#include<ctype.h>#include ...

  8. django中的urlpatterns的正则语法

    ^ 指定起始字符或字符串,放进[]代表否定 $ 指定终止字符 / 对应原来的字符 [...] 括号中表示一个字符的格式设置 \d 任何一个数字字符 \D 非数字的字符 \w 任何一个字符[a-zA-Z ...

  9. Core 3 WPF MVVM框架 Prism系列之数据绑定

    一.安装Prism 1.使用程序包管理控制台# Install-Package Prism.Unity -Version 7.2.0.1367 也可以去掉‘-Version 7.2.0.1367’获取 ...

  10. 对js原型对象、实例化对象及prototype属性的一些见解

    什么是原型对象? 请看下面的代码,我们以各种姿势,创建了几个方法! function fn1() { } var fn2 = function () { } var fn3 = new Functio ...