写在之前
在昨天的文章(零基础学习 Python 之模块(一))中我们是在原来知识的基础上继续的了解了一下「模块」,已经显示了编写模块和在程序中导入模块的基本方式,当然了,在实践中所编写的模块会更复杂一些,今天我们要继续的学习下去。
__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 时就默认已经安装好的模块统称为「标准库」,熟悉标准库是学习编程必须要做的事,所以,这就是我们明天要继续干的活。
如果你觉得本篇文章对你有帮助的话,欢迎点赞转发。
The end。