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中实现单例模式的三种方法
Apr 08 Python
Python抓取百度查询结果的方法
Jul 08 Python
python中zip()方法应用实例分析
Apr 16 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
python读写json文件的简单实现
Apr 11 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
python Pandas 读取txt表格的实例
Apr 29 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
关于python字符串方法分类详解
Aug 20 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
opencv-python的RGB与BGR互转方式
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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
Python语法快速入门指南
2015/10/12 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python获取linux系统信息的三种方法
2020/10/14 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
高中生自我评语大全
2014/01/19 职场文书
求职面试个人自我评价
2014/02/28 职场文书
质量承诺书范文
2014/03/27 职场文书
中专生自荐信
2014/06/25 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
安全承诺书格式范本
2015/04/28 职场文书
老兵退伍感言
2015/08/03 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
mysql幻读详解实例以及解决办法
2022/06/16 MySQL
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS
JavaScript实现音乐播放器
2022/08/14 Javascript