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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Python的互斥锁与信号量详解
Sep 12 Python
Python如何计算语句执行时间
Nov 22 Python
如何在Python 游戏中模拟引力
Mar 27 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
scrapy头部修改的方法详解
Dec 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
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
php面向对象值单例模式
2016/05/03 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
a标签click和href执行顺序探讨
2014/06/23 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
python用什么编辑器进行项目开发
2020/06/17 Python
python 利用toapi库自动生成api
2020/10/19 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
师德建设实施方案
2014/03/21 职场文书
导师工作推荐信范文
2014/05/17 职场文书
地方课程教学计划
2015/01/19 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis