首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你也可以随心控制,一文让你轻松掌握Python模块的“灭霸”

这几次,已经和大家探讨了Python的模块化编程相关的东东,相信大家对于Python模块的定义啦、模块的加载啦、还有模块的本质啦等等已经完全掌握啦,关于Python模块相关的东东,咱们再聊最后一个重要知识点吧,他就是江湖人称的Python模块的“灭霸”。

灭霸,相信看过复仇者联盟的朋友已经相当熟悉了,他带着他滴宝贝手套可以随心所欲的控制宇宙!其实呢,Python模块也有个类似灭霸的手套,它就是Python模块的”__all__”变量,好啦,下面咱们就聊聊它吧!

首先呢,先说一下场景,咱们再默认情况下,使用“from 模块名 import *”来导入模块后,Python程序呢就会帮咱们导入这个模块中的所有非下划线开头的程序单元哦,相信大家对这个有一定的了解了,但是呢,也有特殊的场景,比如你的模块中如果很多成员,而你又不希望每个成员都会被暴露出来供外界拿来随心使用,这时呢,Python的灭霸手套就派上用场了,下面正式出场!

Python模块的”__all__”变量,就可以将变量的值设置成一个列表,它的好处就是,只有这个列表中的程序单元才能被暴露出来使用哦!

还是老惯例,咱们举个“栗子”:

上面咱们写的这个模块呢,内部定义了三个函数单元,分别是hi()、function1()、function2(),下面咱们就来测试一下吧,怎么测试呢,当然是先写个测试程序啦!

运行结果如下所示哦:

可以看到,正常情况下hi()、function1()和function2()这三个函数都执行了哦,这时咱们就会想啦,如果咱们不想暴露function2()呢,该如何处理呢,方法当然就是用Python模块的“__all__”变量定义函数序列啦!

下面咱们就加入”__all__”变量的定义吧:

下面再运行一下上面咱们写的“test1_mymodule.py”程序,运行结果如下哦:

看到了吗,前面运行的hi()和function1()函数都是正常输出的,但到运行function2()函数就出现“NameError”的错误啦,这是说function2()函数没有定义也就是找不到哦,这就是Python模块的“__all__”变量的威力所在,使用它你可以随心控制你的模块中想被外界引入和暴露的单元哦。

下面就说一下“__all__”变量的本质吧,实际上呢,Python模块的”__all__”变量就是给模块定义了一个开放的公共接口,这样就只有”__all__”变量列出的程序单元才能被外界使用哦

其实呢,这与Python中的带下划线的程序单元被隐藏是一个道理,都是一种伪隐藏的技术,也可以理解为是Python的一丢丢小技巧,因为即使你使用Python模块的“__all__”变量定义了供外界访问的程序单元,也还是有办法访问其他你不想暴露的程序单元滴,那怎么搞呢?就是按照下面的方法啦:

主要有两种方法哦!

方法一:就是使用”import 模块名”,也就是上面的“from mymodule import *”改为“import mymodule”,这样你就可以使用模块名字前缀来调用啦,比如上面咱们隐藏的function2()函数,虽然你用”__all__”变量定义了不暴露它,但你可以用mymodule.function2()这样调用运行哦!

方法二:就是使用特指方法喽,就是使用” from 模块名 import 程序单元”来导入特定的程序单元哦,比如上面如果想调用function2()函数,就可以用”from mymodule import function2”来导入,然后直接运行function2()就可以啦!

好啦,关于Python模块的“灭霸”,咱们就聊到这了哦,咱们已经了解了针对Python模块的“灭霸手套”的“矛”和“盾”,相信大家已经完全掌握了哦,就聊到这吧,下次见哦!

敬请关注“品位集结号”,为您带来意外的小知识!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201114A04FT000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券