python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单
一、引言
《第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模块导入白名单相关推荐
- python类变量共享吗_第7.12节 可共享的Python类变量
第7.12节 可共享的Python类变量 一. 引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...
- python交互式方式、代码文件方式_涨见识了,在终端执行 Python 代码的 6 种方式
原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...
- python金融大数据分析师工资待遇_三年工作经验大佬带你解读 Python金融大数据分析...
内容提要: Python凭借其简单.易读.可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析.处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的首选编程语言.本书提供了使用P ...
- python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)
问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...
- python有趣小项目源码分析_推荐 10 个有趣的 Python 项目
想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼,因此,我为大家准备了10个 ...
- python语言的使用不需要付费_人生不值得,我在用python.1_关于python
一直喜欢编程,最近决定潜心入坑.起初一直在研究要学什么语言,想过c语言,学过VB(两天...),后来听说了python,功能强大,并且适合小白入手.文笔不行,但还是申请了博客号,以便记录.发表自己的所 ...
- python 不等于None 不等于空_干货 | 健身前后的黄金饮食法则,不懂等于白练!
原标题:干货 | 健身前后的黄金饮食法则,不懂等于白练! 很多想要减脂的朋友,拒绝摄入任何碳水化合物.想要增肌的朋友,一味地就吃蛋白质.但实际上,不管你是减脂还是增肌,碳水和蛋白质都是不可缺少的,因为 ...
- python 不等于None 不等于空_高考励志标语条幅押韵:不拼不搏等于白活
经典词句网精品说说朋友圈文案(高考励志标语条幅押韵:不拼不搏等于白活)在线阅读赏析,下面是小编为大家带来的最新精彩内容! 1.不经三思不求教 不动笔墨不读书 2.不苦不累,高三无味:不拼不搏,等于白活 ...
- python 使用文本注解绘制树节点_实用篇 | 34 个最火的 Python 开源框架
阅读文本大概需要 5 分钟. 我们从近 10000 个 Python 开源框架中评价整理的 34 个最为好用的开源框架,它们细分可以分为 Python Toolkit.Web.Terminal.Cod ...
最新文章
- ACID+CAP+BASE+Transaction(事务)
- 1102: 火车票退票费计算(函数专题)
- S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习
- java基本数据类型与封装类 示例_Java零基础系列教程10Java抽象与封装
- 7号团队-团队任务3:每日例会(2018-11-29)
- mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
- 使用Java第2部分查询DynamoDB项
- (zhuan) LSTM Neural Network for Time Series Prediction
- itlwm驱动_黑苹果系统 macOS 驱动英特尔无线网卡的小教程
- 基于表面肌电信号的连续运动估计之前言(一)
- 简单的Qt倒计时程序--番茄钟
- 强连通分量(Tarjan算法)
- 省级-上市公司数字经济数据(2013-2020年)
- 计算机键盘无法识别,电脑插上键盘显示无法识别USB?
- 膜片联轴器市场现状及未来发展趋势
- 计算机ps基础知识大全,全国计算机ps一级考试题型
- swift学习之旅之 iOS Flurry使用
- solidworks装配体改为柔性_软件技巧:大神整理的SolidWorks技巧总结
- 小程序canvans一键截屏纯前端实现
- H5活动邀请函用这个就可以了
热门文章
- Groovy里使用Runnable实现多线程
- 介绍一个非常好用的文件服务器 - HFS
- where is language of sap.ui.getCore().getConfiguration set - locale
- SAP CRM Fiori应用 my Opportunity的扩展
- different styles of button in footer area
- 如何使用腾讯云提供的虚拟主机
- SAP云平台上的ABAP编程环境能做哪些事情
- ABAP to Json
- webdynpro view navigation - the same as Webclient UI
- IPC RFC call in Service Order scenario