Python中的包模組引用成員的方法
1、問題背景
舉個例子,假設我們有一個名為
package
的包,其中包含
foo_module.py
和
example_module.py
兩個子模組。
test. py
package /
__init__. py
foo_module. py
example_module. py
在
test.py
中,我想引用
package
中的成員,但並不希望看到
foo_module
和
example_module
這兩個子模組本身。我希望
package
模組看起來像這樣:
>>> vars( package)
mapping_proxy({ foo: < function foo at 0 x…}, { example: < function example at 0 x…})
也就是說,我希望
package
中的所有子模組的成員都在
package
的名稱空間中,而子模組本身不在名稱空間中。
2、解決方案
有多種方法可以解決這個問題,其中一種方法是使用
from module import name
形式的匯入方式。對於
example_module.py
,我們可以這樣匯入:
from package.foo_module import foo
對於
__init__.py
,我們可以這樣匯入:
from package. foo_module import foo
from package. example_module import example
__all__ = [ foo, example] # not strictly necessary, but makes clear what is public
在
test.py
中,我們可以這樣匯入:
from package import example
注意,這種方法只適用於在包層級執行
test.py
,否則需要確保包含
package
的資料夾在Python模組搜尋路徑中。
另一種方法是使用動態匯入。這涉及在
__init__.py
檔案中動態匯入包中的所有模組,並將其成員新增到包的名稱空間中。以下是一個示例:
def _import_all_modules():
""" Dynamically imports all modules in this package. """
import traceback
import os
global __all__
__all__ = []
globals_, locals_ = globals(), locals()
# Dynamically import all the package modules in this file's directory.
for filename in os. listdir( __name__):
# Process all python files in directory that don't start
# with underscore (which also prevents this module from
# importing itself).
if filename[ 0] != '_' and filename. split( '.')[ - 1] in ( 'py', 'pyw'):
modulename = filename. split( '.')[ 0] # Filename sans extension.
package_module = '.'. join([ __name__, modulename])
try:
module = __import__( package_module, globals_, locals_, [ modulename])
except:
traceback. print_exc()
raise
for name in module. __dict__:
if not name. startswith( '_'):
globals_[ name] = module. __dict__[ name]
__all__. append( name)
_import_all_modules()
在
test.py
中,我們可以這樣匯入:
from package import *
這種方法更加動態,不需要在
__init__.py
檔案中硬編碼包模組名稱。需要動態匯入新模組時,它將自動匯入它們,而不再嘗試匯入從目錄中刪除的模組。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006524/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 跨包引用模組
- #### 使用方法引用的使用場景--通過物件名引用成員方法物件
- Python3中如何做的自定義模組的引用?Python
- Python - 模組包Python
- Dill模組中的引用、父母和孩子
- 匯出Wireless組中的成員
- python開發學習之如何更好的引用Python模組?Python
- Python包與模組Python
- Python - 模組與包Python
- python模組與包Python
- python 安裝模組的方法Python
- python包和模組的內容整理Python
- Python中的類、模組和包究竟是什麼?Python
- 使用 Python 擴充套件豐富 UiBot 的功能及在 UiBot 中引用 Python 模組Python套件UI
- python中的chardet模組Python
- Python中模組的使用Python
- Python中的abc模組Python
- 在Python中將字典轉為成員變數的方法Python變數
- python之匯入模組的方法Python
- Python包和模組管理Python
- Python類、模組、包的概念及區別Python
- Python的包(package)和模組(module)介紹PythonPackage
- Python 中argparse模組的使用Python
- Python中paramiko 模組的用法Python
- Python中operator 模組的用法Python
- Python中pathlib 模組的用法Python
- Python中itertools 模組的用法Python
- python中重要的模組--asyncioPython
- Python學習之如何引用Python自定義模組?Python
- Python模組過載的五種方法Python
- 使用 PyExecJS2 庫時 js 引用包的模組路徑問題JS
- Python中的collections.Counter模組Python
- Python中yaml模組的使用教程PythonYAML
- Java 中的方法引用Java
- ArrayList的常用成員方法
- python 基礎之模組與包Python
- Python學習之模組與包Python
- 【python】類的特殊成員Python