前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python import 与 __all__

Python import 与 __all__

作者头像
雪飞鸿
发布2020-06-16 16:17:37
1.1K0
发布2020-06-16 16:17:37
举报
文章被收录于专栏:me的随笔me的随笔

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;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • import module
  • import package
    • __init__.py为空,main.py:
      • __init__.py中指定模块name
        • __init__.py中导出模块中的部分名称
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档