首页 > 编程语言 > 详细

Python import 与 __all__

时间:2020-06-15 13:35:32      阅读:48      评论:0      收藏:0      [点我收藏+]

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;

 

推荐阅读

Python Modules

Python Package

Python Namespace and Scope

Can someone explain all in Python?

Python import 与 __all__

原文:https://www.cnblogs.com/Cwj-XFH/p/13129991.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!