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警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
Python 描述符(Descriptor)入门
Nov 20 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
Python实现GUI学生信息管理系统
Apr 05 Python
python实现聚类算法原理
Feb 12 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
python中altair可视化库实例用法
Jan 26 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
javascript URL锚点取值方法
2009/02/25 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
JS实现前端缓存的方法
2017/09/21 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
JavaScript实现随机点名小程序
2020/10/29 Javascript
python ip正则式
2009/05/07 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python的标准模块包json详解
2017/03/13 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
python中adb有什么功能
2020/06/07 Python
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
在校生党员自我评价
2013/09/25 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
工作失职检讨书
2015/01/26 职场文书
Python实现简单的猜单词
2021/06/15 Python
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
CSS的calc函数用法小结
2022/06/25 HTML / CSS
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android