首页 > 代码库 > Python _X __all__ 模拟 导入'私有'变量 及其注意点和实例

Python _X __all__ 模拟 导入'私有'变量 及其注意点和实例

开头是下划线的变量(如_X):

在特定的情况下,可以吧下划线放在变量名的签名(如_X)可以防止客户端使用from *语句导入模块名时,把其中的那些变量名复制出去;但是下划线不是‘私有‘声明:仍可以使用其他导入形式看见并且修改这类变量例如使用import

__all__(语句)

此外也可以在模块顶层把变量名的字符串列表赋值给变量__all__以达到类似_X命名惯例的隐藏效果;使用此功能,from*语句只会把列在__all__列表中的这些变量名复制出来


__all__是指出要复制的变量名,而_X时指出不要被复制的变量名;Python会先寻找模块内的__all__列表(如果定义__all__的时候,只会复制__all__内的变量名,不会复制开头没有下划线的变量名),如果没有定义的话,from * 就会复制出开头没有单下划线的所有变量名

__all__列表只对from *语句这种形式有效,并不是私有声明

例子:

#test.py

key=‘got‘

_nooutpute=‘lllllllllllllll‘

error=‘fasdfsa‘

code=‘fsadfsa‘

decode=‘324324‘

__all__=[‘error‘,‘code‘,‘decode‘]

print {‘already‘: (lambda :2+2),

 ‘got‘:(lambda :2*4),

 ‘one‘: (lambda :2**4)

 }[key]()

#_X__all__.py

from test import *

print(error)

print(key)


注意点:

可以看出__all__中的必须是变量名,并且在引用之前一定要进行赋值


#test.py更改测试__all__

error=‘fasdfsa‘

code=‘fsadfsa‘

decode=‘324324‘

__all__=[‘error‘,‘code‘,‘decode‘,‘testname‘]

#_x__all__.py

from test import *


print(error)

print(testname)




Python _X __all__ 模拟 导入'私有'变量 及其注意点和实例