zoukankan      html  css  js  c++  java
  • python学习笔记 day20 导入模块和包

    导入模块:

    import demo
    money=200
    demo.func()  # demo.py中有变量名money 在该文件中又定义了一个money=200 那么demo.py中的money 变量打印100 因为会现在本地找,read()函数的本地就是它所在的py文件

    运行结果:

    同一个模块不会被重复导入

    import demo
    import demo

    运行并不会报错,是因为在导入模块时 首先会去sys.modules中去找,这个模块存不存在,存在的话就不导入,不存在就按照sys.path的路径去找,找到就会为这个模块开辟一个命名空间,用来存放这个被导入的模块中的变量,找不到就报错~

    import sys
    import demo
    import demo
    print(sys.modules) # 导入模块时首先看sys.modules里有没有,没有的话 就按照sys.path给的路径查找,有就不在重复导入
    print(sys.path)  # 模块会按照sys.path给的路径去查找

    运行结果:

    __all__=['变量名','变量名']  与 from modules import * 配套使用

    只有在__all__列表中的变量名和函数名才可以被其他模块引用:

    正常情况下:

    demo.py:  (被导入的模块名不能是数字开头)

    money=100
    def func():
        print('hello,xuanxuan')
    
    def func2():
        print("你好,璇璇")

    02.py文件中:(最好不要这样命名py文件)

    import demo
    print(demo.money)  # 导入demo模块之后,可以使用模块.变量名去引用该变量
    demo.func() # 可以使用demo.func调用该模块的函数
    demo.func2()

    运行结果:

     在被引用的模块中加上__all__=['变量名1','变量名2'] 只有在这个列表中的变量和函数才可以被其他模块引用(注:__all__后面是一个列表,列表中的元素必须是字符串)

    先来看一下被导入的模块demo.py文件:

    __all__=['money','func']  # __all__必须和from demo import * 配套! __all__后面必须是一个列表。列表中的元素必须是字符串,里面的元素 才可以被外部导入该demo模块时被引用
    money=100
    def func():
        print('hello,xuanxuan')
    def func2():
        print('你好,璇璇')

    先导入demo 模块(要想02.py文件在使用demo.py文件中的变量受到约束时,必须使用from demo import * 这种方式导入,该导入方式是和 __all__配套使用!)

    from demo import *  # 必须以这种方式导入模块 才可以被__all__中的列表约束
    print(money)  # 因为money已经在demo.py的__all__列表中,所以可以被使用~
    func()  # 因为func也已经在__all__列表中,所以也可以被调用

    运行结果:

    但是:

    from demo import *  # 必须以这种方式导入模块 才可以被__all__中的列表约束
    # print(money)  # 因为money已经在demo.py的__all__列表中,所以可以被使用~
    # func()  # 因为func也已经在__all__列表中,所以也可以被调用
    func2()  # 由于该函数名func2并不在demo.py 的__all__中,所以并不能在当前文件中被执行(NameError: name 'func2' is not defined)

    运行结果:

     __name__,在一个模块中有__name__ 当我们执行该模块时,__name__是__main__,但是当别的模块导入该模块时,在别的模块运行__name__就变为这个被引用的模块名

    demo.py:

    print(__name__)  # 该__nmae__在demo.py中运行时,会输出__main__ 但是该demo.py被其他文件引用时,就会显示demo 就是这个被引用模块的模块名

    运行该demo.py文件

    然后在别的文件中导入该demo模块:

    import demo
    print("这里是02.pyw文件中运行结果")

    运行结果:

    所以如果我们有一个需求,就是在有一个模块比如用户登录模块单独封装在一个py文件(写好了一系列接口,就是定义了很多和登陆操作相关的函数)中,当我们在该文件中运行时会执行相应代码(比如一些函数的调用,打印语句),但是别人写的一些别的py文件 比如购物车程序需要用到用户登录,也就是得用到之前写好的模块(py文件),但是我又不想打印原来那个函数的一些信息,只是想调用几个接口(函数),应该怎么做呢?

    demo.py:

    def welcome():
        print("欢迎光临~")
    def login():
        print("正在登录....")
    def login_sucess():
        print("恭喜您,登录成功~")
    def bye():
        print("再见,欢迎下次光临~")
    print(__name__)  # __name__在该文件中运行时会打印__main__,当该文件被别的文件调用时,会输出demo 也就是这个被导入的模块名
    if __name__=='__main__':
        print("这些代码,是只想在本py文件中输出,在被的文件中调用该py文件时 是不会显示的,因为别的文件运行时,__name__是demo 不是__main__")
        welcome()
        login()
        login_sucess()
        bye()

    运行demo.py文件:

     注意 此时在demo.py中运行时 __name__的值是__main__

     02.py:(导入demo.py模块)

    import demo
    print("之前在demo.py文件中位于if __name__=='__main__'中的代码都不会被执行~")

    运行该02.py文件:

    注意导入demo.py在02.py中运行时 demo.py中的__name__显示demo (也就是被引用的这个模块的模块名)

     __name__直接在写改语句的文件中执行是__main__,在别的py文件中导入该文件时 在别的文件中运行结果是被导入的这个模块的名字,效果是不一样的!

    talk is cheap,show me the code
  • 相关阅读:
    简单工厂、工厂方法、抽象工厂
    c#之反射总结
    设计模式Builder(建造者)模式
    c#之委托和事件的区别
    c#之委托总结
    javascript之流程控制 和函数的容易忽略点
    javascript之六种数据类型以及特殊注意点
    Sublime Text 快捷键
    链接中获取文件名
    js 获取当天23点59分59秒 时间戳 (最简单的方法)
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9652003.html
Copyright © 2011-2022 走看看