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中bisect的用法
Sep 23 Python
python常规方法实现数组的全排列
Mar 17 Python
django用户登录和注销的实现方法
Jul 16 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
人工神经网络算法知识点总结
Jun 11 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
python 实现单通道转3通道
Dec 03 Python
Python zip函数打包元素实例解析
Dec 11 Python
python多进程重复加载的解决方式
Dec 13 Python
Python实现寻找回文数字过程解析
Jun 09 Python
Django封装交互接口代码
Jul 12 Python
Pandas数据分析的一些常用小技巧
Feb 07 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常用函数汇总
2014/12/17 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
基于vue2.0实现简单轮播图
2017/11/27 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python原始套接字编程示例分享
2014/02/21 Python
深入理解Python装饰器
2016/07/27 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
历史学专业推荐信
2013/11/06 职场文书
关于环保的建议书400字
2014/03/12 职场文书
请假条范文大全
2014/04/10 职场文书
工地安全质量标语
2014/06/07 职场文书
学习教师法的心得体会
2014/09/03 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python