python中模块的__all__属性详解


Posted in Python onOctober 26, 2017

python模块中的__all__属性,可用于模块导入时限制,如:

from module import *

此时被导入模块若定义了__all__属性,则只有__all__内指定的属性、方法、类可被导入。

若没定义,则导入模块内的所有公有属性,方法和类

# kk.py 
class A(): 
  def __init__(self,name,age): 
    self.name=name 
    self.age=age 
class B(): 
  def __init__(self,name,id): 
    self.name=name 
    self.id=id 
def func(): 
  print 'func() is called!' 
def func1(): 
  print 'func1() is called!'
#test_kk.py 
from kk import * #由于kk.py中没有定义__all__属性,所以导入了kk.py中所有的公有属性、方法、类 
a=A('python','24') 
print a.name,a.age 
b=B('python',123456) 
print b.name,b.id 
func() 
func1()

运行结果:

python 24
python 123456
func() is called!
func1() is called!

#kk.py 
__all__=('A','func') #在别的模块中,导入该模块时,只能导入__all__中的变量,方法和类 
class A(): 
  def __init__(self,name,age): 
    self.name=name 
    self.age=age 
class B(): 
  def __init__(self,name,id): 
    self.name=name 
    self.id=id 
def func(): 
  print 'func() is called!' 
def func1(): 
  print 'func1() is called!'
#test_kk.py 
from kk import * #kk.py中定义了__all__属性,只能导入__all__中定义的属性,方法和类 
a=A('python','24') 
print a.name,a.age 
func() 
#func1() #NameError: name 'func1' is not defined 
#b=B('python',123456) #NameError: name 'B' is not defined

运行结果:

python 24
func() is called!

#kk.py 
def func(): #模块中的public方法 
  print 'func() is called!' 
def _func(): #模块中的protected方法 
  print '_func() is called!' 
def __func():#模块中的private方法 
  print '__func() is called!'
#test_kk.py 
from kk import * #这种方式只能导入公有的属性,方法或类【无法导入以单下划线开头(protected)或以双下划线开头(private)的属性,方法或类】  
func() 
#_func() #NameError: name '_func' is not defined 
#__func() #NameError: name '__func' is not defined

运行结果:

func() is called!

__all__=('func','__func','_A') #放入__all__中所有属性均可导入,即使是以下划线开头 
class _A(): 
  def __init__(self,name): 
    self.name=name 
def func():  
  print 'func() is called!'  
def func1():  
  print 'func1() is called!'  
def _func():  
  print '_func() is called!'  
def __func():  
  print '__func() is called!'
from kk import *   
func()  
#func1() #func1不在__all__中,无法导入 NameError: name 'func1' is not defined 
#_func() #_func不在__all__中,无法导入 NameError: name '_func' is not defined 
__func() #__func在__all__中,可以导入 
a=_A('python') #_A在__all__中,可以导入 
print a.name

运行结果:

func() is called!
__func() is called!
python

#kk.py 
def func(): 
  print 'func() is called!' 
def _func(): 
  print '_func() is called!' 
def __func(): 
  print '__func() is called!'
#test_kk.py 
from kk import func,_func,__func #可以通过这种方式导入public,protected,private 
func() 
_func() #NameError: name '_func' is not defined 
__func() #NameError: name '__func' is not defined

运行结果:

func() is called!
_func() is called!
__func() is called!

#kk.py 
def func(): 
  print 'func() is called!' 
def _func(): 
  print '_func() is called!' 
def __func(): 
  print '__func() is called!'
#test_kk.py 
import kk #也可以通过这种方式导入public,protected,private 
kk.func() 
kk._func() #NameError: name '_func' is not defined 
kk.__func() #NameError: name '__func' is not defined

运行结果:

func() is called!
_func() is called!
__func() is called!

#kk.py 
import sys 
__all__ = ["func"] # 排除了 'sys' 
def func(): 
  print 'func() is called!'
#test_kk.py 
from kk import * 
#print sys.path #NameError: name 'sys' is not defined 
func()

运行结果:

func() is called!

如果一个模块需要暴露的接口改动频繁,__all__ 可以这样定义:

__all__ = [
  "foo",
  "bar",
  "egg",
]

最后多出来的逗号在 Python 中是允许的,也是符合 PEP8 风格的。

模块中不使用__all__属性,则导入模块内的所有公有属性,方法和类 。

模块中使用__all__属性,则表示只导入__all__中指定的属性,因此,使用__all__可以隐藏不想被import的默认值。

__all__变量是一个由string元素组成的list变量。

它定义了当我们使用 from <module> import * 导入某个模块的时候能导出的符号(这里代表变量,函数,类等)。

from <module> import * 默认的行为是从给定的命名空间导出所有的符号(当然下划线开头的变量,方法和类除外)。

需要注意的是 __all__ 只影响到了 from <module> import * 这种导入方式,

对于 from <module> import <member> 导入方式并没有影响,仍然可以从外部导入。

总结

以上就是本文关于python中模块的__all__属性详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python内建函数之raw_input()与input()代码解析、Python面向对象编程基础解析(一)、python中requests爬去网页内容出现乱码问题解决方法介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python中pass语句用法实例分析
Apr 30 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python pandas修改列属性的方法详解
Jun 09 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
pybind11和numpy进行交互的方法
Jul 04 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
Python实现计算图像RGB均值方式
Jun 04 Python
Python如何实现线程间通信
Jul 30 Python
Python的信号库Blinker用法详解
Dec 31 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 #Python
python分布式环境下的限流器的示例
Oct 26 #Python
Python Nose框架编写测试用例方法
Oct 26 #Python
Python面向对象编程基础解析(二)
Oct 26 #Python
Python面向对象编程基础解析(一)
Oct 26 #Python
获取Django项目的全部url方法详解
Oct 26 #Python
Python探索之ModelForm代码详解
Oct 26 #Python
You might like
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
html下载本地
2006/06/19 Javascript
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
js实现查询商品案例
2020/07/22 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
简历中自我评价分享
2013/10/09 职场文书
教师师德承诺书
2014/03/26 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
大学生求职意向书
2015/05/11 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
ipad隐藏软件app图标方法
2022/04/19 数码科技