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中操作日期和时间之gmtime()方法的使用
May 22 Python
Python正则表达式实现截取成对括号的方法
Jan 06 Python
Python实现自动上京东抢手机
Feb 06 Python
python3实现磁盘空间监控
Jun 21 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
Python list运算操作代码实例解析
Jan 20 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python如何使用代码运行助手
Jul 03 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 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新手上路(十三)
2006/10/09 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
jquery下json数组的操作实现代码
2010/08/09 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
js变量提升深入理解
2016/09/16 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
Python 元类使用说明
2009/12/18 Python
Python中的作用域规则详解
2015/01/30 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
港湾网络笔试题
2014/04/19 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
美术专业个人自我评价
2014/01/18 职场文书
公司委托书格式范文
2014/04/04 职场文书