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中的sort方法使用详解
Jul 25 Python
跟老齐学Python之字典,你还记得吗?
Sep 20 Python
Python标准异常和异常处理详解
Feb 02 Python
python 定义给定初值或长度的list方法
Jun 23 Python
浅析python的优势和不足之处
Nov 20 Python
学生信息管理系统Python面向对象版
Jan 30 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
python pandas写入excel文件的方法示例
Jun 25 Python
基于Python中的yield表达式介绍
Nov 19 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 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中array_multisort对多维数组排序的方法
2020/06/21 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
Django中Forms的使用代码解析
2018/02/10 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
jupyter 添加不同内核的操作
2021/02/06 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
美国性感女装网站:bebe
2017/03/04 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
管理学专业个人求职信范文
2013/12/13 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
物理教学随笔感言
2014/02/22 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
工程催款通知书
2015/04/17 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
读书笔记怎么写
2015/07/01 职场文书
运动会致辞稿
2015/07/29 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
python基础之爬虫入门
2021/05/10 Python
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis