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文件)

扫描二维码关注公众号,回复: 3209072 查看本文章
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文件中导入该文件时 在别的文件中运行结果是被导入的这个模块的名字,效果是不一样的!

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9652003.html