相对导包,批量导入,别名调用,全部导入,限制导出, 限制执行理解

相对导包,批量导入,别名调用,全部导入,限制导出, 限制执行理解,第1张

相对导包

以当前代码文件执行的所在目录作为起始路径,基于.或者..导入模块或包,这样的导包路径写法,就是相对导包。

注意:因为程序所在根目录默认是作为绝对导包的起始导包路径,所以相对导包路径的写法,不能应用于根目录下的文件中。

常见写法如下:

from . import 模块 from .模块 import 变量 from .包 import 模块 from .包.模块 import 变量 from .. import 模块 from ..包 import 模块 from ..包.模块 import 变量

相对导包写法,会因为不同执行文件带来的路径差异,所以容易产生导包路径的写法错误而且还不容易理解,因此开发中,能优先使用绝对导包千万要使用绝对路径导包。

批量导入

导包语句也可以在末尾使用使用逗号,一次性导入多个包/模块/变量,不管使用的是绝对导包,还是相对导包都可以。

import 包名1, 包名2, ... import 包名1.模块名1, 包名1.模块名2, ..., 包名2.模块名1, 包名2.模块名2,... from 包名 import 模块名1, 模块名2, ... from 包名.模块名 import 变量1, 变量2, ...

import os, sys, psutil, datetime
# 相当于下面代码的简写
# import os
# import sys
# import psutil
# import datetime
​
​
from datetime import time, date, datetime
# 相当于下面代码的简写
# from datetime import time
# from datetime import date
# from datetime import datetime

别名调用

导包语句也可以在末尾使用as关键字,对包/模块/变量进行别名调用,不管使用的是绝对导包,还是相对导包都可以。

import 包名1 as 包别名1
import 包名1 as 包别名1, 包2 as 包别名2, ...
​
import 包名1.模块名1 as 模块别名1, 包名1.模块名2 as 模块别名2, ....
from 包名 import 模块名1 as 模块别名1, 模块名2 as 模块别名2, ...
​
from 包名.模块名 import 变量1 as 变量别名1, 变量2 as 变量别名2, ...
# 别名调用的作用是,让被导入的变量不要和当前模块中的变量产生冲突
from time import time as ctime
print( ctime() )
​
​
def time():
    return 1
​
print(time())
​
print( ctime() )

全部导入

可以通过*号导入一个模块下所有的内容信息到当前模块,支持绝对导包和相对导包写法的。

模块.py,代码:

from 模块 import *
from 包名.模块 import *
from mod12 import * 
# * 代表把当前模块中所有内容全部导入,注意 * 只是一个符号,不是一个变量,不能使用*号在导包以外的地方
​
print(a, b, c, d, e, f)
​
# 如果真要查看*号里面都导入了啥东西
print( locals() )
"""
{..... '__cached__': None, 'a': 100, 'b': 200, 'c': 300, 'd': 300, 'e': 300, 'f': 300}
"""

mod12.py,代码:

a = 100
b = 200
c = 300
d = 300
e = 300
f = 300

限制导出

python的所有模块中都提供了一个__all__魔术变量,可以限制 * 导出内容。只有写在当前模块的__all__变量中的成员,才能被 * 导出到外界。如果模块没有声明__all__限制导出内容,则 * 号可以导出当前模块所有内容

__all__ = ['m1_a', 'm1_f']
​
m1_a = 100
m1_b = 200
m1_c = 200
m1_d = 200
m1_f = 200

主程序.py,代码:

from mod13.m1 import *
print(locals())
"""
{.... '__cached__': None, 'm1_a': 100, 'm1_f': 200}
"""

限制执行

在前面的学习中,我们发现一个问题,就是每次导包,路径下的__init__.py和被导入的模块中代码会自动被执行,所以有时候模块和测试代码也会在导入时自动打印数据

如果希望模块文件中的代码,作为主程序运行时执行,而作为模块被其他文件导包时不要执行,那么可以基于__name__来限制代码执行

在python中,每一个模块内部都会存在一个魔术变量__name__ 在模块被其他文件导入时,值为模块名,如果模块被python 解释器作为主程序执行时,则值为"__main__"

模块.py,代码:

from mod14 import d14
def fn():
    return “hello”
if __name__ == '__main__': #可以限制部分测试代码,在被外界导包时,不要执行
fn()
print(d14.md_14)

mod14/d14.py,代码:

md_14 = [1,2,3,4,45]

"""
__name__是一个魔术变量,
当前文件作为主程序被python解释器运行时,值就是"__main__",
当前文件作为第三方模块被导包时,则值时"导包路径"
例如:__name__=mod14.d14
"""xxxxxxxxxx __name__"""__name__是一个魔术变量,当前文件作为主程序被python解释器运行时,值就是 "__main__"当前文件作为第三方模块被导包时,则值是"导包路径",例如:__name__=mod14.d14"""

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存