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;

 

推薦閱讀

Python Modules

Python Package

Python Namespace and Scope

Can someone explain all in Python?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM