zoukankan      html  css  js  c++  java
  • 模块导入

    一、模块导入

    对于一个真实的pyhton程序,我们不可能自己完成所有的工作,通常都需要借助于第三方类库。此外,也不可能在一个源文件中编写整个程序的源代码,这些都需要以模块化的方式来组织项目的源代码。

    导入模块需要用到import语法。import有两个主要的用法:

    1.import 模块名 导入整个模块

    2.form 模块名 import 成员名

    二、 模块导入方式一:import 模块名

    import md

    在一个py文件下运行程序的步骤:

    1首先会创建一个该py文件的名称空间

    2运行模块(md.py文件)中的代码,并将成圣的名字和值存放在内存空间中

    注意:不要多次导入相同模块

    1.2访问模块名称空间中名字方法:模块名.名字

    import md
    md.read1()
    md.read2()
    md.change()

    下面是md.py文件中的代码

    money = 1000
    def read1():
      print('md',money)
    def read2():
      print('md模块')
      read1()
    def change():
      global money
      money = 0

    这样避免与执行py文件中的名字冲突。

     1.3多个模块的导入

    应该转行写。并且写在执行文件的开头

    import os
    import time
    import md

     1.4当模块名比较复杂,可以给模块名取别名

     为已经导入的模块起别名的方式对编写可扩展的代码很有用

    1 import spam as sm
    2 print(sm.money)

    1.5在一行导入多个模块

    1 import sys,os,re

    三、模块导入方式二:from 模块名 import 成员名

    这个方法是导入的模块中的具体某个功能

    记住:

    这个方法import后面是模块中的成员名;

    而import 模块名方法,则import后面跟的模块名。

    执行文件的代码:

    from md import money
    money = '我是执行文件中的money

    print(money)

    下面是md.py文件中的代码

    money = 1000

     运行结果是:我是执行文件中的money。如果模块导入放在money下面结果就不一样了。原因用到from 模块名 import 具体内容的流程

    会先创建执行文件的名称空间
        首次导入md.py模块
            1.运行md.py
            2.将产生的名字存放到md.py名称空间中
            3.直接拿到指向模块md.py名称空间中某个值的名字

     总结:from 模块名 import 成员名句式的缺点

    1.访问模块中的名字不需要加模块名前缀
    (因为这样,极易与执行文件的名字重复,导致打印结果不对。)
    2.在访问模块中的名字可能会与当前执行文件中的名字冲突

     补充:

    一、from 模块名(文件名) import 具体功能(需要调用的具体功能)

    假如需要使用导入模块中的多个具体功能。可以用*号代替

    from md1 import * 

    但是这引起了一个缺点:占内存(一次性将所有名字放入内存)和不知道哪些名字能够使用(没有重复)

    二、__all__

    在这个模块调用模式下,写在被调用模块的代码中限制被执行文件获取的名字

    __all__ = ['money','read1','read2']

     现在只有这些名字可以被执行文件引用

     四、循环导入

    如果出现循环导入问题 那么一定是你的程序设计的不合理
    循环导入问题应该在程序设计阶段就应该避免

    执行文件代码:

    from dir1.dir import m1
    m1.f1()

    m1的代码

    print('正在导入m1')
    def f1():
      from dir1.dir.m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'

    m2的代码

    print('正在导入m2')
    def f2():
      from dir1.dir.m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'

    解决循环导入问题的方式

    1.方式1
    将循环导入的句式写在文件最下方()

    2.方式2
    函数内导入模块

    1.方式1
    将循环导入的句式写在文件最下方()

    2.方式2
    函数内导入模块

    五、_name_的使用

    当一个文件被当做模块调用时,不希望一调用就出来打印结果,那么可以在被调用的文件中加入:

    if __name__=='__main__':
        函数1()
        函数2()

    因为文件被调用有一个特点,被当做执行文件时,__name__打印结果是__main__

    当被当做模块导入时,结果为模块名

    关于上面的代码还有一个简写形式:
    输入main直接tab键

    五、模块的查找顺序:

    1、模块的查找顺序:

    ①、先从内存中找

    ②、再从内置中找

    ③、最后在sys.path中找(可以理解为环境变量),sys.path是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹

    2、注意点:一定分清楚谁是执行文件谁是被导入文件(******),py文件名不应该与模块名(内置的,第三方的)冲突

    3、将文件路径添加到sys.path中

    import sys
    sys.path.append(r'D:Python项目dir1')
    from dir1.dir import md
    # 当需要导入的模块不在执行文件的目录下时,可以利用这种方式找到模块文件
    # 缺点:添加的路径太过绝对,用户自定义安装后会导致该路径失效,软件崩溃。

    六、绝对导入和相对导入

    绝对导入必须依据执行文件所在的文件夹路径为准
    1绝对导入无论在执行文件中还是被导入文件都适用

    相对导入
    .代表的当前路径
    ..代表的上一级路径
    ...代表的是上上一级路径

    注意相对导入不能再执行文件中使用
    相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑
    执行文件到底是谁 只需要知道模块与模块之间路径关系

    from dir1.dir import m1

    意思为:调用dir1下的dir文件夹中的m1文件

    七、软件开发目录规范

    项目名
        bin
            start.py(项目启动文件)
        conf
            settings.py(项目配置文件)
        core
            src.py(项目核心逻辑)
        db
            数据库相关文件
        lib
            common.py(项目所用到的公共的功能)
        log
            log.log(项目的日志文件)
        readme.txt(项目简介)
      1、strat.py
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import os
    import sys
     
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_DIR)
    """
    pycharm会自动将你新建的最顶层的目录添加到sys.path中
    上面这两句话,不是针对你的,是针对下载你这个软件的用户
    """
     
    from core import src
     
    if __name__ == "__main__":
        src.run()
     
    # 当start.py文件主动执行时才会调用src.run()函数
     
    # 1.将core文件路径添加到system path中  (...太low)
    # 2.将项目文件夹添加到system path中
    注意:不要手动拼接路径,跨系统时可能会出错
  • 相关阅读:
    Ubuntu16.04 + CUDA 8.0 (GTX 1050ti)
    关于MapD的集群建立
    2-7 单位和坐标系
    2-6 光线投射
    2-5 事件系统(Event System)
    2-4 Rect Transform(矩形)组件的属性
    2-3 RectangleTransform矩形组件
    2-2 Graphic Raycasrer组件(光线投射)
    2-1 Ui元素-画布
    1-5 事件方法的执行顺序
  • 原文地址:https://www.cnblogs.com/ZDQ1/p/11196130.html
Copyright © 2011-2022 走看看