Python入门自学进阶——3--模块相关概念
Posted kaoa000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门自学进阶——3--模块相关概念相关的知识,希望对你有一定的参考价值。
模块:Python中,一个.py文件称之为一个模块(Module)。一个模块可以包含很多函数。可以大大提高代码的可维护性。
一共三种模块:
- Python标准库
- 第三方模块
- 应用程序自定义模块
前面介绍的常用模块,就是Python标准库,也就是Python标准模块。前面使用的openpyxl模块就是第三方模块。应用程序自定义模块,就是我们自己开发的python程序。
自定义模块:
编写一个自己的mymaths.py文件,就是一个模块。使用自己的模块:
在引入自定义模块时,编辑器中飘红了,
但是却可以继续使用。Python解释器通过搜索路径找到mymaths.py模块后,将mymaths.py中的所有代码解释一遍都给了mymaths,相当于mymaths = mymaths.py。
搜索路径,通过sys模块的path:print(sys.pat)显示如下:
['D:\\\\pythonstudy\\\\week02', 'D:\\\\pythonstudy', 'C:\\\\Program Files\\\\JetBrains\\\\PyCharm 2020.1\\\\plugins\\\\python\\\\helpers\\\\pycharm_display', 'D:\\\\pythonstudy\\\\venv\\\\Scripts\\\\python37.zip', 'C:\\\\Python\\\\Python37\\\\DLLs', 'C:\\\\Python\\\\Python37\\\\lib', 'C:\\\\Python\\\\Python37', 'D:\\\\pythonstudy\\\\venv', 'D:\\\\pythonstudy\\\\venv\\\\lib\\\\site-packages', 'C:\\\\Program Files\\\\JetBrains\\\\PyCharm 2020.1\\\\plugins\\\\python\\\\helpers\\\\pycharm_matplotlib_backend']
可以看到路径第一个就是当前工作目录,所以能够找到自定义的模块。
如果一个模块中定义的函数非常多,而我们的程序只需要其中的某一个,可以使用
from 模块名 import 函数名1[,函数名2]来只导入相关函数。
包:就是一个特殊的目录,用来组织模块,特殊的地方是这个目录下有一个__init__.py文件。
包中模块及函数的导入:
两个平行的包之间的调用,
bin包与web包同级,现在想在bin包下编写一个bin.py程序,调用web下mylogger模块中的函数,或是web下的子包web2下的mymod模块。
出现错误的原因是因为路径中没有web包的路径。在bin文件中执行print(sys.path),
['D:\\\\pythonstudy\\\\week02\\\\bin', 'D:\\\\pythonstudy', 'C:\\\\Program Files\\\\JetBrains\\\\PyCharm 2020.1\\\\plugins\\\\python\\\\helpers\\\\pycharm_display', 'D:\\\\pythonstudy\\\\venv\\\\Scripts\\\\python37.zip', 'C:\\\\Python\\\\Python37\\\\DLLs', 'C:\\\\Python\\\\Python37\\\\lib', 'C:\\\\Python\\\\Python37', 'D:\\\\pythonstudy\\\\venv', 'D:\\\\pythonstudy\\\\venv\\\\lib\\\\site-packages', 'C:\\\\Program Files\\\\JetBrains\\\\PyCharm 2020.1\\\\plugins\\\\python\\\\helpers\\\\pycharm_matplotlib_backend']
第一个是文件bin的路径,第二个是项目的路径,这个路径是pycharm给加进去的,脱离pycharm
是没有这个路径的。而我们需要的路径是D:\\\\pythonstudy\\\\week02路径,将此路径加入到路径中:
执行成功。
问题来了,当我的程序拷贝到其他地方时,还会出错,这是绝对路径引起的错误,拷贝到其他地方,绝对路径肯定要改变,除非按照你的绝对路径创建。
这里要使用__file__变量。在pycharm中运行结果如下,貌似一个绝对路径
在命令窗口下运行
就是一个文件名。
那么使用abspath()函数得到绝对路径,使用dirname()函数得到其父目录。
对于bin.py中,想要找到web下的模块,必须知道其父目录路径,即要知道:\\pythonstudy\\week02路径。
所以只要保证项目内的目录层次相同,就可以运行,实际绝对路径由BASE_DIR确定。
关于__name__ 变量:如下hello.py
先定义了一个函数,然后执行了这个函数,结果打印hello。再编写另一个程序test.py,调用这个hello.py中的h1()函数。
结果出现了两个hello,第一个hello是import hello时执行了hello.py中的最后一行的h1(),第二个hello是test.py中调用hello.h1()打印的。
这不是我们想要的结果。在hello.py中,最后执行h1()是为了测试一下定义的函数h1()的正确性,在其他程序调用时不应该执行。修改hello.py:
执行hello.py运行没有问题。执行test.py
在引入hello模块时,不执行h1()了。修改hello.py,打印__name__变量:可见此时__name__的值为__main__
在test.py中运行:可见此时__name__的值为hello
在本模块中__name__就是__main__,其他模块中调用,__name__就是调用的模块的名称。
这样,通过一个 if __name__ =='__main__': 就可以将测试代码限定在本模块。
关于项目的目录结构:一个好的目录结构对开发和维护都很重要。
以上是关于Python入门自学进阶——3--模块相关概念的主要内容,如果未能解决你的问题,请参考以下文章
Python入门自学进阶-Web框架——20Django其他相关知识2
Python入门自学进阶-Web框架——19Django其他相关知识
Python入门自学进阶-Web框架——19Django其他相关知识