python中模块的__all__属性详解
python模块中的__all__属性,可用于模块导入时限制,如:
frommoduleimport*
此时被导入模块若定义了__all__属性,则只有__all__内指定的属性、方法、类可被导入。
若没定义,则导入模块内的所有公有属性,方法和类
#kk.py classA(): def__init__(self,name,age): self.name=name self.age=age classB(): def__init__(self,name,id): self.name=name self.id=id deffunc(): print'func()iscalled!' deffunc1(): print'func1()iscalled!'
#test_kk.py fromkkimport*#由于kk.py中没有定义__all__属性,所以导入了kk.py中所有的公有属性、方法、类 a=A('python','24') printa.name,a.age b=B('python',123456) printb.name,b.id func() func1()
运行结果:
python24
python123456
func()iscalled!
func1()iscalled!
#kk.py __all__=('A','func')#在别的模块中,导入该模块时,只能导入__all__中的变量,方法和类 classA(): def__init__(self,name,age): self.name=name self.age=age classB(): def__init__(self,name,id): self.name=name self.id=id deffunc(): print'func()iscalled!' deffunc1(): print'func1()iscalled!'
#test_kk.py fromkkimport*#kk.py中定义了__all__属性,只能导入__all__中定义的属性,方法和类 a=A('python','24') printa.name,a.age func() #func1()#NameError:name'func1'isnotdefined #b=B('python',123456)#NameError:name'B'isnotdefined
运行结果:
python24
func()iscalled!
#kk.py deffunc():#模块中的public方法 print'func()iscalled!' def_func():#模块中的protected方法 print'_func()iscalled!' def__func():#模块中的private方法 print'__func()iscalled!'
#test_kk.py fromkkimport*#这种方式只能导入公有的属性,方法或类【无法导入以单下划线开头(protected)或以双下划线开头(private)的属性,方法或类】 func() #_func()#NameError:name'_func'isnotdefined #__func()#NameError:name'__func'isnotdefined
运行结果:
func()iscalled!
__all__=('func','__func','_A')#放入__all__中所有属性均可导入,即使是以下划线开头 class_A(): def__init__(self,name): self.name=name deffunc(): print'func()iscalled!' deffunc1(): print'func1()iscalled!' def_func(): print'_func()iscalled!' def__func(): print'__func()iscalled!'
fromkkimport* func() #func1()#func1不在__all__中,无法导入NameError:name'func1'isnotdefined #_func()#_func不在__all__中,无法导入NameError:name'_func'isnotdefined __func()#__func在__all__中,可以导入 a=_A('python')#_A在__all__中,可以导入 printa.name
运行结果:
func()iscalled!
__func()iscalled!
python
#kk.py deffunc(): print'func()iscalled!' def_func(): print'_func()iscalled!' def__func(): print'__func()iscalled!'
#test_kk.py fromkkimportfunc,_func,__func#可以通过这种方式导入public,protected,private func() _func()#NameError:name'_func'isnotdefined __func()#NameError:name'__func'isnotdefined
运行结果:
func()iscalled!
_func()iscalled!
__func()iscalled!
#kk.py deffunc(): print'func()iscalled!' def_func(): print'_func()iscalled!' def__func(): print'__func()iscalled!'
#test_kk.py importkk#也可以通过这种方式导入public,protected,private kk.func() kk._func()#NameError:name'_func'isnotdefined kk.__func()#NameError:name'__func'isnotdefined
运行结果:
func()iscalled!
_func()iscalled!
__func()iscalled!
#kk.py importsys __all__=["func"]#排除了'sys' deffunc(): print'func()iscalled!'
#test_kk.py fromkkimport* #printsys.path#NameError:name'sys'isnotdefined func()
运行结果:
func()iscalled!
如果一个模块需要暴露的接口改动频繁,__all__可以这样定义:
__all__=[ "foo", "bar", "egg", ]
最后多出来的逗号在Python中是允许的,也是符合PEP8风格的。
模块中不使用__all__属性,则导入模块内的所有公有属性,方法和类。
模块中使用__all__属性,则表示只导入__all__中指定的属性,因此,使用__all__可以隐藏不想被import的默认值。
__all__变量是一个由string元素组成的list变量。
它定义了当我们使用from
from
需要注意的是__all__只影响到了from
对于from
以上就是本文关于python中模块的__all__属性详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python内建函数之raw_input()与input()代码解析、Python面向对象编程基础解析(一)、python中requests爬去网页内容出现乱码问题解决方法介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!