零基础学习 Python 之模块

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85258646

写在之前

随着我们对 Python 的逐步学习,相信 Python 的强大你也感觉到了,它主要体现在 Python 的「模块」上,因为 Python 不仅有很强大的标准库,还有数不胜数的第三方模块(或者包,库),并且许多的开发者还在不断的贡献着自己的新模块。

正是因为 Python 强大的「模块自信」和它开放包容的态度,Python 才被很多人所钟爱,并且这种方式也在不断的被其他更多的语言所借鉴,几乎成了普世行为。

编写模块

学到现在,相信你已经很熟悉 import 语句了,下面我们来看一个之前说过的例子:

>>> import math
>>> math.pow(2,3)
8.0

这里的 math 就是 Python 标准库中的一个,用 import 引入这个模块,然后可以使用他这里面的方法,比如 pow()。显然不需要自己动手来写具体的函数,我们要做的就是拿过来直接用,这就是模块的好处。

这里有一点需要注意的是,我们所说的「模块」,「库」,「包」什么的是有区别的,只不过我们现在不区分,随着学习的深入就会慢慢明白的。

模块是什么?

模块是什么?「模块是程序」!大佬们的话一语道破本质,它就是一个扩展名为 .py 的 Python 程序,我们要在应该使用它的时候将它引用过来,不需要重写雷同的代码。

这里可能会有人问:但是如果要我们自己写一个 .py 文件,是不是就可以作为模块 import 呢?事情远没有那么简单,还必须让 Python 解释器可以找到你写的模块才可以:比如我们在 /usr/lib 下建了一个名为 test.py 的文件,你想把它作为一个模块引入,就必须先告诉 Python 解释器我们写了这么一个文件:

>>>import sys
>>>sys,path.append("/usr/lib/test.py")

用上述的方式就是告诉 Python 解释器我们写的那个文件在哪里,在这个告诉的方法中也用了 import sys,不过 sys 是 Python 的标准之一,所以不需要特别告诉 Python 解释器的位置。

上面的是在 Ubuntu 系统的地址格式(我随手写的地址),如果用的是 windows 的话,则要注意文件路径的写法,直接 import test 就好,然后再调用里面的东西就好了,形式是「模块名.属性或类」,当然,如果不存在的话就会报错。

到这里,你可以去看一下你刚才存储的 test.py 的目录中,是不是又多了一个 pycache 的目录,并且该目录下还有 pm.cpython-**.pyc 文件,这个就是刚才 test.py 文件编译之后的文件。

不知道你是否还记得前面写完程序然后要执行时我们常常用到 if name == “main”,那时候我们直接用 python **.py 的格式来运行该程序,此时我们同样也有了 .py 文件,不过在这里是作为模块引入的。

PS:一般情况下,如果仅仅时作为模块引入,不必写 name == “main”。

模块的位置

为了让我们自己写的模块可以被 Python 解释器知道,需要用 sys.path.append("/usr/lib/test.py")。你看,这多麻烦,这么麻烦还是我们 Python 嘛!所以,Python 想了一招,把所有可用的模块都加入到了 sys.path 中,用下面的方法可以看到模块所在的位置:

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)

打印出来的结果,你可以看到我们自己写的那个文件,结果列表里所包括位置内的 .py 文件都可以作为模块引入。

将模块文件放到指定的位置是一种不错的方法,但是作为一个放飞自己爱自由的程序员,你就得想能不能放到别处呢?答案是肯定的,用 sys.path.append() 就可以做到,不管把文件放在哪里,都可以把其位置告诉 Python 解释器。虽然这种方法在前面使用了,但其实这个很不常用,因为它也有麻烦的地方,比如在交互模式下,如果关闭了当前的 terminal,再重新开启一个的话又得重新告知。那么有没有舒服点的方法呢?有的,比较常用的就是「设置环境变量」,相信这个对于现在的你来说是小菜一碟的事情,实在不会的话随便 Google 一下,答案一大把。

all 在模块中的作用

首先,我们先来写一个模块,且把它命名为 test.py

public_name = 'Hello,this is public name.'
_private_name = 'Hello,thos is private name.'

def public_man():
   print('i am a man,i am from public')

def _private_man():
   print('i am a man,i am from private')

接下来就是我们熟悉的操作了,进入到交互模式,test.py 这个文件就是一个模块,该模块中包含了变量和函数

>>>import sys
>>>sys.path.append("save file site")
>>>from test import *
>>>public_name
'Hello,this is public name'
>>> _private_name
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name '_private_name' is not defined

以上变量 public_name 可以被使用,但是另一个变量 _private_name 不能被调用,我们先来看一下两者的区别,后者是以单下划线开头的,说明这是一个「私有变量」。而 from test import * 的含义是「希望可以访问模块(test)中有权限访问的全部名称」,那些被视为私有的变量或者函数或者类等,当然是没权限访问的。

再比如以下的操作:

>>>public_man()
i am a man,i am from public
>>> _private_man()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name '_private_man' is not defined

然后,这个其实不是绝对的,如果想要访问具有私有性质的东西,可以像下面这样操作:

>>>import test
>>>test._private_man()
i am a man,i am from private
>>>test._private_name
'Hello,this is private name.'

下面让我们对 test.py 进行改写,增加一些东西:

__all__ = ['_private_name','public_man']

public_name = 'Hello,this is public name.'
_private_name = 'Hello,thos is private name.'

def public_man():
   print('i am a man,i am from public')

def _private_man():
   print('i am a man,i am from private')

在上面这个修改的 test.py 文件中,增加了 all 属性及其相应的值,在列表中包含了一个私有变量和一个函数的名字,这个其实是在告诉引用本模块的解释器,这两个东西是有权限被访问的,而且只有这两个东西。

>>>import sys
>>>sys.path.append('file save site')
>>>from test import *
>>>_private_name
Hello,this is public name

果不其然,曾经不能被访问的私有变量现在能够访问了。

>>> public_name
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'public_name' is not defined

因为上述的变量没有在 all 的值中,虽然曾经可以被访问,但是现在就不行了,剩下的几个也是如此,可以自行尝试一番。

这个只不过是再次说明前面的结论罢了。当然,如果以 import test 引入模块,再用 test._private_man() 的方式是一样的。

包 & 库

其实看名字我们大体可以知道,「包 & 库」应该是比模块大的。事实上也是如此,一般来讲,一个「包」里面会有多个模块,当然「库」是一个更大的概念,拿 Python 来说,Python 标准库中的每个库都有好多个包,每个包又有好多个模块。

既然一个包里有多个模块,那么这个所谓的「包」其实可以看做是我们熟悉的「目录」,现在就需要解决如何引用某个目录中的模块问题了,解决办法就是在该目录中放一个 init.py 的空文件,将它放在某个目录中,就可以将该目录中的其它 .py 文件作为模块被引用。

写在之后

模块的小入门到这就结束了,不知道你掌握了多少。不知道你有没有听说过「Python 自带 “电池”」这句话,在 Python 被安装的时候,就有不少模块随着安装到了本地的计算机上,这些东西让 Python 拥有了无限生机,我们将这些在安装 Python 时就默认已经安装好的模块统称为「标准库」,熟悉标准库是学习编程必须要做的事,所以,这就是我们明天要继续干的活。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/85258646