zoukankan      html  css  js  c++  java
  • 模块的表现形式、使用时内部发生的细节、循环导入问题、__name__的用法等

    模块:

    就是一系列功能的结合体

    模块的三种来源:

    1.内置的(python解释器自带的)

    2、第三方的(别人写的)

    3、自定义的(自己手写的)

    模块的四种表现形式:

    1.自己用Python编写的py文件也可以成为是一个模块

    2.已被编译为共享库或DLL的C或C++扩展(了解)
    3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)
    包:一系列py文件的结合体
    4.使用C编写并连接到python解释器的内置模块

    为什么使用模块:

    1、使用别人写好的模板(内置或者第三方的)可以极大的提高开发效率,而且自己写的话不一定功能那么全面。

    2、自定义的模板:当你在遇到一个规模较大的项目时,内部可能会有很多重复的方法,这是就需要分开写在不同的py文件中,再将一些公共的方法在一个py文件中,其他py文件想要使用这些方法时可以直接以模块的形式直接调用。

    如何使用模块:

    (****重点****)要正确区分哪个是执行文件哪个是被导入文件。

    右键运行run.py文件首先会创建一个run.py的名称空间
    首次导入模块(md1.py)(******)
    1.执行md.py文件
    2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
    3.在执行文件中产生一个指向名称空间的名字(md)
    多次导入不会再执行模块文件,会沿用第一次导入的成果(******)

     在使用import导入模块时,访问模块中名称空间中的变量时,为模块名.变量名,永远不会和执行文件中相同的变量名发生冲突,想访问模块中的名字是必须使用模块名.名字的方式。

    重点:

    1.函数是第一类对象,只要通过变量名得到这个函数的内存地址,就可以通过变量名加括号的形式来调用这个函数

    2.函数在定义阶段,它内部变量取值的查找顺序就已经固定死了,不会因为调用位置的改变而改变。

    当几个模块之间有联系或者具有相似部分时导入时可以写在一行,否则需要分多次导入。

    当模块名字较长较复杂是可以为其取个别名:import    模块名    as     别名

    异常通常有两类:

    1、语法结构错误:需要当场修改,异常处理try:....except:....检测不到

    2、逻辑结构错误:异常捕获可以处理

    使用from    模块名   import    变量名    时过程与使用import时相似

    但是可以直接拿到被调用模块中的某个变量名

    使用这种方式的缺点:

    1.访问模块中的名字不需要加模块名的前缀

    2.容易与执行文件中相同的变量名产生冲突

    from    md1   import   *可以调用md1中全部的名字,但是不太推荐使用,因为不清楚有哪些可以用,造成内存的过量占用。

    __all__可以用来限制调用模块时可以得到的名字

    __all__ = ['money','read1','read2']#在别的模块中调用时只能得到列表中的这些名字。

    循环导入问题的解决方案:

    循环导入问题:

    当右键运行run.py文件时,先创建一个run.py的名称空间,第一次导入m1时,先创建m1的名称空间,打印正在导入m1,之后又去导入m2,m2也是第一次被导入,所以先创建一个m2的名称空间,之后m1中创建m2指向m2的名称空间,之后m2中第二次导m1,但是这时需要导入的x并没有被创建所以会出现报错现象,这就是循环导入问题。

    循环导入问题一定是你的程序设计的不合理,我们应到在程序设计阶段就避免。

     解决方案:

    方式1:

    将循环导入的句子写在文件的最下方

    方式2:

    函数内导入模块(如上图)

    __name__:可以用来区分文件时执行文件还是被当做模块调用,防止了被当做模块调用时,文件还要被运行一遍的尴尬局面。

    具体用法:

    def index2():
    print('index2')
    # print(__name__)
    # 当文件被当做执行文件执行的时候__name__打印的结果是__main__
    # 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
    # if __name__ == '__main__':
    # index1()
    # index2()

    快捷写法:main之后直接按tab键即可。

    模块的查找顺序:

    1、先从内存中找

    2、从内置中找

    3、从sys.path中找(环境变量):

    ****重点*****:需要正确区分谁是执行文件,谁是被导入文件。(因为查找过程中是以执行文件为基准去找的)

    是一个放着一堆文件路径的大列表,但第一个文件路径永远是执行文件的所在文件夹。

    import time
    import md
    time.sleep(20)
    md.f1()

    用来验证是否先从内存中取,需要在time.sleep(20)时,将md.f1()删掉,证明已经事先将模块加载到内存中了。

    还需要注意自定义模块名(文件名)不应该与内置的(和第三方的)模块名冲突

    import sys 

    sys.path.append(r'D:\Python项目\day14\dir1')    #将这个文件夹添加到环境变量中

    print(sys.path)

    绝对导入:需要依据执行文件所在的文件夹路径为准

    在执行文件中和被导入文件中都适用

    from dir1.dir import m1

    m1.f1()

    相对导入:

    .表示当前路径

    ..表示上一级路径

    ...代表上上一级路径

    注意:

    1、相对导入不能在执行文件中用

    2、相对导入不用考虑执行文件是哪个,只需要关心当前模块与被导入文件之间的路径关系。

    软件开发目录规范:

    1、项目启动文件通常放在两个地方

             1、bin文件夹下

     start.py

             2、直接放在根目录

    2、conf:配置文件

    settings.py

    3、lib:公共的方法

    common.py

    4、core:核心逻辑代码

    src.py

    5、log:日志

    talk_log.py

    6、db:数据库相关的操作

    userinfo.txt

    7、readme:对软件的介绍

    将ATM的文件夹放到环境变量中,可以兼容所有用户  

    __file__:当前的文件所在位置

    启动文件的固定格式:

    import   sys 

    import    os

    BASE_DIR = os.path.dirname(os.path.dirname(__file__))#dirname返回上一级

     sys.path.append(BASE_DIR)

    from   core    import   stc

    if   __name__=='__main__'

    src.run()

  • 相关阅读:
    移动端页面使用rem布局
    Vue2.0 render:h => h(App)
    sublime3 快捷键大全
    node-webkit学习之【无边框窗口用JS实现拖动改变大小等】
    mock.js-无需等待,随机产生数据,让前端独立于后端进行开发
    Sublime Text 3 遇到的一些小坑的解决方法
    Angular Cli 升级到最新版本
    Angular 表单嵌套、动态表单
    angular6 iframe应用
    JS 时间格式 相互转化
  • 原文地址:https://www.cnblogs.com/yangjiaoshou/p/11197199.html
Copyright © 2011-2022 走看看