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中的array数组模块相关使用
Jul 05 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
python实现黑客字幕雨效果
Jun 21 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 Python
python中如何使用虚拟环境
Oct 14 Python
基于Python实现全自动下载抖音视频
Nov 06 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
基于empty函数的判断详解
2013/06/17 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
理解javascript中的闭包
2017/01/11 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
详解Python中的正则表达式
2018/07/08 Python
python散点图实例之随机漫步
2018/08/27 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Python初学者常见错误详解
2019/07/02 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
大班开学家长寄语
2014/04/04 职场文书
学生自我评语大全
2014/04/18 职场文书
计生专干事迹
2014/05/28 职场文书
六查六看剖析材料
2014/10/06 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
小学安全教育主题班会
2015/08/12 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技