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自动化测试之连接几组测试包实例
Sep 28 Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 Python
python文件与目录操作实例详解
Feb 22 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Tensorflow 实现修改张量特定元素的值方法
Jul 30 Python
python实现录音小程序
Oct 26 Python
python实现两张图片的像素融合
Feb 23 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
Python 实现集合Set的示例
Dec 21 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
anaconda python3.8安装后降级
Jun 11 Python
Python实战之OpenCV实现猫脸检测
Jun 26 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
强制设为首页代码
2006/06/19 Javascript
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
实例讲解React 组件
2020/07/07 Javascript
Python实现子类调用父类的方法
2014/11/10 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
python 创建一维的0向量实例
2019/12/02 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
法学专业求职信
2014/07/15 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
网络销售员岗位职责
2015/04/11 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书