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其他相关知识

Python入门自学进阶——2--常用模块

Python入门自学进阶-Web框架——21DjangoAdmin项目应用

Python入门自学进阶-Web框架——21DjangoAdmin项目应用