zoukankan      html  css  js  c++  java
  • 模块和包

    import my_moudle
    import my_moudle #这里的想要告诉我们,只在第一次
    导入时才会执行,后面再导入回执行,但是不会显示
    sys.module是一个字典,内部包含模块名与模块对象的映射,
    这个字典决定了到入模块时是否需要重新导入
    每个模块都是一个独立的名称空间
    测试money与my_moudle.money不冲突
    money=10
    print(my_moudle.money)
    测试read1与my_moudle不冲突
    def read1():
    print('=====')
    my_moudle.read1()
    测试my_moudle.change()操作的全局变量money仍然是my_moudle中的
    money=1
    my_moudle.change()
    print(money)

    首次导入模块会做三件事:
    1.为源文件(my_moudle模块)创建新的名称空间,在my_moudle中定义的函数
    和方法若是使用到了global时访问的就是这个名称空间
    2.在新创建的名称空间中执行模块中包含的代码
    3.创建名字my_moudle来引用该名称空间
    为模块名起别名
    import my_moudle as sm
    print(sm.money)

    在一行导入多个模块
    import sys,os,re
    测试一:导入的函数read1,执行时仍然回到my_moudle.py中寻找全局变量money
    from my_moudle import read1
    money=10000
    read1()

    测试二:导入的函数read2,执行时需要调用read1(),仍然回到my_moudle.py中找read1()
    from my_moudle import read2
    def read1():
    print('=====')
    read2()

    当前有重名的read1或read2,有覆盖效果
    from my_moudle import read1
    def read1():
    print('=====')
    read1()
    python中的变量赋值不是一种存储操作,而是I一种绑定关系
    from my_moudle import money,read1
    money=100 #将当前位置的名字money绑定到了100
    print(money) #打印当前的名字
    read1() #读取my_moudle.py中的名字money,仍然为1000


    from my_moudle import read1 as read
    导入多行
    from my_moudle import(
    read1,
    read2,
    money
    )

    from my_moudle import *
    把my_moudle中所有不是以下划线(_)开头的名字导
    入到当前位置,不提倡用这种方式导入,因为你都不
    清楚到底导入了什么,很有可能覆盖自己之前定义的名字,
    并且可读性极差,在交互环境中导入没有问题
    __all__=['money','read1'] #有*就有all

    每个模块只被导入一次,放在字典sys.moudle中,如需改变模块内容,则需重启
    python不支持重新加载或卸载之前导入的模块


    但是你如果实在想改,就用,反正还是不建议改
    import time,importlib
    import my_moudle
    my_moudle.func1()
    time.sleep(15)
    importlib.reload(my_moudle)
    my_moudle.func1()

    把模块当脚本运行
    _name__等于'__main__'
    当作模块导入
    __name__=模块名
    作用:用来控制.py文件字不同的应用场景下执行的不同逻辑
    if__name__=='__main__'
    def fib(n):
    a, b = 0, 1
    while b < n:
    print(b, end=' ')
    a, b = b, a+b
    print()

    if __name__ == "__main__":
    print(__name__)
    num = input('num :')
    fib(int(num))


    模块搜索路径
    模块查找顺序:内存中已经加载的--内置----sys.path路径中包含的模块
    注意:我们自定义的模块不应该和系统内置模块重名

    搜索时按照sys.path中从左到右的顺序查找
    #首先制作归档文件:zip module.zip foo.py bar.py

    import sys
    sys.path.append('module.zip')
    import foo,bar

    #也可以使用zip中目录结构的具体位置
    sys.path.append('module.zip/lib/python')

    #windows下的路径不加r开头,会语法错误
    sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')
    编译python文件
    dir函数
    内建函数dir是用来查找模块中定义的名字,返回一个有序字符串列表
    import my_moudle
    dir(my_moudle)
    如果没有参数,dir()列举出当前定义的名字


    dir()不会列举出内建函数或者变量的名字,它们都被定义到了标准模块builtin中,可以列举出它们,
  • 相关阅读:
    Microsoft Dynamics CRM 常用JS语法(已转成vs2017语法提示)
    IIS7如何实现访问HTTP跳转到HTTPS访问
    C#调用PB写的com组件dll
    C# winform程序免安装.net framework在XP/win7/win10环境运行!
    文件上传漏洞
    OWASP TOP 10
    sql
    ASCII码查看
    sql注入--mysql
    sql注入--access
  • 原文地址:https://www.cnblogs.com/1996-11-01-614lb/p/7327359.html
Copyright © 2011-2022 走看看