专栏首页me的随笔Python import 与 __all__

Python import 与 __all__

import module

使用from <module> import *导入模块时,若显式定义了__all__,则只导入__all__中的name,否则会导入除以下划线开头的所有name

文件目录结构

|---main.py
|---module.py

定义module文件:

# __all__ in a module, means that when you import * from the module, only those names in the __all__ will imported
__all__ = ['hello', 'Person', '__private']
​
_internal = 'internal'
​
__private = 'private'
​
​
class Person():
    def __init__(self):
        print('init person')
​
​
def hello():
    print('hello')
​
​
def world():
    print('world')

导入模块:

import module
​
module.Person()
module.hello()
# 可以访问以下划线开头的name
print(module._internal)
module.world()
​
# ======================================
​
from module import *
​
Person()
hello()
print(__private)
​
# NameError: name 'world' is not defined
# world()
​
# NameError: name '_internal' is not defined
print(_internal)

import package

package中的__init__.py文件会影响到包文件的导入

文件目录结构

|---main.py
|---packages
    |---__init__.py
    |---pkg.py

__init__.py为空,main.py

import packages.pkg as ppkg
​
ppkg.Package()
ppkg._internal
​
# =============================================
​
from packages import pkg
​
pkg.Package()
​
# =============================================
​
# 不会导入任何name
from packages import *

__init__.py中指定模块name

__init__.py

__all__ = ['pkg']

main.py

import packages.pkg as ppkg
​
ppkg.Package()
ppkg._internal
​
# =============================================
​
from packages import *
​
pkg.Package()
pkg._internal

__init__.py中导出模块中的部分名称

__init__.py

from pkg import *
​
__all__ = ['Package', 'init']

main.py

import packages as pg
​
pg.Package()
​
# ============================================
​
from packages import Package
​
Package()
​
# =============================================
​
from packages import pkg
​
# AttributeError: 'function' object has no attribute 'Package'
# pkg.Package()
​
# =============================================
​
from packages import *
​
Package()
init()
# name 'pkg' is not defined
# pkg.Package()
# pkg._internal

对于package的导入,若__init__.py不为空,则只能导入__init__.py中指定的模块(中的)name; __init__.py为空时,通过from package import *无法导入任何name;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET Core MVC 视图

    布局用于提供各个页面所需的公共部分,如:菜单、页头、页尾等。在ASP.NET Core中默认的布局文件是位于/Views/Shared文件夹下的_Layout....

    雪飞鸿
  • Redis 缓存设计原则

    本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接。

    雪飞鸿
  • Redis中的数据结构与常用命令

    对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据。

    雪飞鸿
  • 浅谈IPv4协议与IPv6协议的区别!

    在讲IPv4协议与IPv6协议的区别前,我们必须了解什么叫IPv4协议和IPv6协议?

    墨者盾
  • 为什么 IPv6 难以取代 IPv4

    网络层协议承担了分组(Packet)转发和路由选择两大功能,它能够为上层提供在不同主机之间运输分组的职责,IP 协议作为网络层协议,它虽然只能提供无连接的、不可...

    范蠡
  • python pyro4远程调用框架(并行编程 35)

    import Pyro4 @Pyro4.expose class GreetingMaker(object): def get_fortune(self,...

    用户5760343
  • 手把手教你使用PyTorch从零实现YOLOv3--构建网络代码讲解(2)

    这是从l零开始实现YOLOv3目标检测教程的第2部分。在上一部分中,解释了YOLO的工作原理,在这一部分中,我们将在PyTorch中实现YOLO所使用的层。换句...

    AI算法与图像处理
  • 干货 | ACL 2019 知识图谱的全方位总结

    ACL 2019已经结束,但其空前的规模仍然震撼人心:2900多篇提交论文,660篇被接收,3000多名会议注册人员,以及4个超过400人的研讨会(比一些国际C...

    数据派THU
  • D-Link数字签名证书遭窃,反倒成了黑客的“通行证”

    数字签名的出现,曾大大加强了计算机应用使用的安全性,其复杂、独特的加密方式使得证书成为了软件的“防伪标志”,并迅速普及。

    FB客服
  • ACL 2019 知识图谱的全方位总结

    ACL 2019已经结束,但其空前的规模仍然震撼人心:2900多篇提交论文,660篇被接收,3000多名会议注册人员,以及4个超过400人的研讨会(比一些国际C...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券