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获取网页状态码示例
Mar 30 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
用Python识别人脸,人种等各种信息
Jul 15 Python
Python模块汇总(常用第三方库)
Oct 07 Python
Python换行与不换行的输出实例
Feb 19 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
增大python字体的方法步骤
Jul 05 Python
Django日志及中间件模块应用案例
Sep 10 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
Django实现聊天机器人
May 31 Python
利用Python判断你的密码难度等级
Jun 02 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生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
php session安全问题分析
2011/06/24 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
Python程序员开发中常犯的10个错误
2014/07/07 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
django项目搭建与Session使用详解
2018/10/10 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
python让函数不返回结果的方法
2020/06/22 Python
Python实现粒子群算法的示例
2021/02/14 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
安全大检查实施方案
2014/02/22 职场文书
工作求职自荐信
2014/06/13 职场文书
四风问题查摆材料
2014/08/25 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
2014年公务员工作总结
2014/11/18 职场文书
大班上学期个人总结
2015/02/13 职场文书
员工试用期工作总结
2019/06/20 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫