Python 创建模块笔记

                     

贡献者: addis

  • 本文处于草稿阶段。

1. 区分脚本和模块

   有时候我们希望同一个 .py 文件既可以作为脚本直接执行也可以作为模块被导入,并且希望该文件可以根据这两种方式自动选择执行什么。这时可以用 __name__ 来判断:

代码 1:my_module.py
#!/usr/bin/python3
# 执行一些命令(无论作为脚本还是模块都会被运行)
# 被赋值的变量会作为模块的全局变量, 定义的函数会作为模板中的函数

print('欢迎使用 my_module.py')

def plus1(num):
    return num + 1

num = 3.5
num2 = plus1(num)

if __name__ == '__main__':
    # 脚本模式下运行的命令
    print('正在被作为脚本执行,  __name__ 的值为 __main__')
else:
    # 作为模块导入时运行的命令
    print('正在被作为模块导入, __name__ 的值为', __name__)
若运行 ./my_module.py 或者 python3 my_module.py 或者 python3 -m my_module,就会得到(-m 选项把模块作为脚本运行)
欢迎使用 my_module.py
正在被作为脚本执行,  __name__ 的值为 __main__
若在同目录下进入 python3 运行 import my_module(或者 import my_module as 其他名字),就会得到
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module

   再来写另一个模块调用上面的模块

代码 2:my_module2.py
#!/usr/bin/python3

print('欢迎使用 my_module2.py')

def plus2(num):
    return num + 2

if __name__ == '__main__':
    # 脚本模式下运行的命令
    print('正在被作为脚本执行,  __name__ 的值为 __main__')
else:
    # 作为模块导入时运行的命令
    print('正在被作为模块导入, __name__ 的值为', __name__)

import my_module

   在同目录打开命令行,运行

>>> import my_module2
欢迎使用 my_module2.py
正在被作为模块导入, __name__ 的值为 my_module2
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module
>>> my_module2.plus2(2)
4
>>> my_module2.my_module.plus1(2)
3
>>> my_module2.my_module.plus1.__module__
'my_module'
>>> my_module2.plus2.__module__
'my_module2'
# fun.__globals__['__file__'] 可以查看一个函数是在哪个文件中定义的(不能是 builtin 函数)。
>>> my_module2.plus2.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module2.py'
>>> my_module2.my_module.plus1.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module.py'


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利