美文网首页
[转载] python中模块的__all__属性

[转载] python中模块的__all__属性

作者: 区块链熊猫 | 来源:发表于2020-12-20 14:41 被阅读0次

    参考链接: Python的__name __(特殊变量)

    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__属性

          本文链接:https://www.haomeiwen.com/subject/jclknktx.html