一、引言

《第10.4节 Python模块的弱封装机制》介绍了Python模块的的弱封装机制,除了使用弱封装机制来从一定程度上防止导入特定成员外,Python模块中还提供可另外一种类似白名单的机制来控制导入的成员,这个机制就是在模块中定义__all__变量,将__all__的值设置成一个列表,只有列表中的模块成员才能被导入。

二、方法介绍

在模块内部定义一个模块内的全局变量__all__,其元素是每个需要允许导出的成员名字符串。

all = [‘成员名1’,…,‘成员名n’]

三、案例

1、我们定义一个imptest模块,包括三个成员变量和5个成员函数,内容如下:

#imptest.py

__all__=['f','_f1','var2','_var3']

var1,var2,_var3='imptest var1','imptest var2','imptest _var3'

_var2

def f():

print("execute ftest function in imptest....")

def _f1():

print("execute _f1(单下划线开头) function in imptest....")

def __f2():

print("execute __f2(双下划线开头) function in imptest....")

def __f3__():

print("execute __f3__(双下划线开头结尾) function in imptest....")

def f4():

print("execute f4 function in imptest....")

print("Now in imptest module!")

2、使用“from 模块名 import *”导入imptest模块的成员并执行验证是否导入成功

>>> from imptest import *

Now in imptest module!

>>> var1

Traceback (most recent call last):

File "", line 1, in

var1

NameError: name 'var1' is not defined

>>> var2

'imptest var2'

>>> _var3

'imptest _var3'

>>> f()

execute ftest function in imptest....

>>> _f1()

execute _f1(单下划线开头) function in imptest....

>>> __f2()

Traceback (most recent call last):

File "", line 1, in

__f2()

NameError: name '__f2' is not defined

>>>

执行截图:

从上述执行情况来看,只有在__all__列表中的成员才能通过“from imptest import *”导入,带下划线的也会正常导入,没有在__all__列表中的成员计算无下划线开头也不能导入。

3、直接使用“import 模块名”导入

源代码:

>>> import imptest

Now in imptest module!

>>> imptest.f()

execute ftest function in imptest....

>>> imptest._f1()

execute _f1(单下划线开头) function in imptest....

>>> imptest.__f2()

execute __f2(双下划线开头) function in imptest....

>>> imptest.__f3__()

execute __f3__(双下划线开头结尾) function in imptest....

>>> imptest.var1,imptest.var2,imptest._var3

('imptest var1', 'imptest var2', 'imptest _var3')

>>>

执行截屏:

从上述执行情况来看,使用“import 模块名”导入后,所有成员都可以正常访问,不受__all__列表的影响。

四、总结

使用__all__定义模块访问白名单:

只对“from 模块名 import *”导入产生影响,对“import 模块名”或“from 模块名 import 成员名”不产生影响;

在__all__列表中的元素不论是否带下划线开头,“from 模块名 import *”都会导入,不受模块的缺省封装机制影响,可以说这是另一种方式的封装;

在模块定义__all__变量后,可以使用“模块.__all__”查看模块建议使用的模块成员。

__all__变量可以认为给模块定义了一个开放的公共接口。通常来说,只有__all__变量列出的模块属性,才是该模块建议外界使用的。因此,为一个大模块定义__all__ 变量,就可以给调用程序建议过滤不需要使用的变量、函数和类,只使用__all__定义的白名单属性。

前面章节介绍过 dir(模块名)可返回模块或类所包含的全部程序单元(包括变量、函数、类和方法等),但直接使用 dir() 函数默认会列出模块内所有的属性,包括以下划线开头的属性,如果模块定义了__all__ 变量,则建议调用者只关注__all__ 变量限定的属性。

python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单相关推荐

  1. python类变量共享吗_第7.12节 可共享的Python类变量

    第7.12节 可共享的Python类变量 一.    引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...

  2. python交互式方式、代码文件方式_涨见识了,在终端执行 Python 代码的 6 种方式

    原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...

  3. python金融大数据分析师工资待遇_三年工作经验大佬带你解读 Python金融大数据分析...

    内容提要: Python凭借其简单.易读.可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析.处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的首选编程语言.本书提供了使用P ...

  4. python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)

    问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...

  5. python有趣小项目源码分析_推荐 10 个有趣的 Python 项目

    想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼,因此,我为大家准备了10个 ...

  6. python语言的使用不需要付费_人生不值得,我在用python.1_关于python

    一直喜欢编程,最近决定潜心入坑.起初一直在研究要学什么语言,想过c语言,学过VB(两天...),后来听说了python,功能强大,并且适合小白入手.文笔不行,但还是申请了博客号,以便记录.发表自己的所 ...

  7. python 不等于None 不等于空_干货 | 健身前后的黄金饮食法则,不懂等于白练!

    原标题:干货 | 健身前后的黄金饮食法则,不懂等于白练! 很多想要减脂的朋友,拒绝摄入任何碳水化合物.想要增肌的朋友,一味地就吃蛋白质.但实际上,不管你是减脂还是增肌,碳水和蛋白质都是不可缺少的,因为 ...

  8. python 不等于None 不等于空_高考励志标语条幅押韵:不拼不搏等于白活

    经典词句网精品说说朋友圈文案(高考励志标语条幅押韵:不拼不搏等于白活)在线阅读赏析,下面是小编为大家带来的最新精彩内容! 1.不经三思不求教 不动笔墨不读书 2.不苦不累,高三无味:不拼不搏,等于白活 ...

  9. python 使用文本注解绘制树节点_实用篇 | 34 个最火的 Python 开源框架

    阅读文本大概需要 5 分钟. 我们从近 10000 个 Python 开源框架中评价整理的 34 个最为好用的开源框架,它们细分可以分为 Python Toolkit.Web.Terminal.Cod ...

最新文章

  1. ACID+CAP+BASE+Transaction(事务)
  2. 1102: 火车票退票费计算(函数专题)
  3. S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习
  4. java基本数据类型与封装类 示例_Java零基础系列教程10Java抽象与封装
  5. 7号团队-团队任务3:每日例会(2018-11-29)
  6. mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
  7. 使用Java第2部分查询DynamoDB项
  8. (zhuan) LSTM Neural Network for Time Series Prediction
  9. itlwm驱动_黑苹果系统 macOS 驱动英特尔无线网卡的小教程
  10. 基于表面肌电信号的连续运动估计之前言(一)
  11. 简单的Qt倒计时程序--番茄钟
  12. 强连通分量(Tarjan算法)
  13. 省级-上市公司数字经济数据(2013-2020年)
  14. 计算机键盘无法识别,电脑插上键盘显示无法识别USB?
  15. 膜片联轴器市场现状及未来发展趋势
  16. 计算机ps基础知识大全,全国计算机ps一级考试题型
  17. swift学习之旅之 iOS Flurry使用
  18. solidworks装配体改为柔性_软件技巧:大神整理的SolidWorks技巧总结
  19. 小程序canvans一键截屏纯前端实现
  20. H5活动邀请函用这个就可以了

热门文章

  1. Groovy里使用Runnable实现多线程
  2. 介绍一个非常好用的文件服务器 - HFS
  3. where is language of sap.ui.getCore().getConfiguration set - locale
  4. SAP CRM Fiori应用 my Opportunity的扩展
  5. different styles of button in footer area
  6. 如何使用腾讯云提供的虚拟主机
  7. SAP云平台上的ABAP编程环境能做哪些事情
  8. ABAP to Json
  9. webdynpro view navigation - the same as Webclient UI
  10. IPC RFC call in Service Order scenario