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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- #### 使用方法引用的使用場景--通過物件名引用成員方法物件
- 跨包引用模組
- Python的靜態方法和類成員方法Python
- 在Python中將字典轉為成員變數的方法Python變數
- Python3中如何做的自定義模組的引用?Python
- Java 中的方法引用Java
- Dill模組中的引用、父母和孩子
- 成員方法的this指標指標
- python中模組和方法的查詢Python
- 【python】類的特殊成員Python
- python 的類 模組 包的區別Python
- Python類、模組、包的區別Python
- Python中的類、模組和包究竟是什麼?Python
- Python - 模組包Python
- TypeScript 中 class 的例項成員與靜態成員TypeScript
- C++類中的常成員和靜態成員C++
- Java中的方法引用詳解Java
- C++中的static成員、static const成員和const成員的初始化C++
- Python關於反射和類的特殊成員方法詳解Python反射
- C++中的成員物件C++物件
- python開發學習之如何更好的引用Python模組?Python
- python包和模組的內容整理Python
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Python中匯入模組或包語句Python
- 18、繼承以及繼承中成員變數和成員方法的重名問題繼承變數
- #JAVA#物件導向(繼承中成員方法的關係)Java物件繼承
- Java繼承中成員方法的overload(過載/過載)Java繼承
- Python爬蟲學習(4): python中re模組中的向後引用以及零寬斷言Python爬蟲
- Python - 模組與包Python
- Python包與模組Python
- Python模組和包Python
- python模組與包Python
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- Python中的abc模組Python
- python中的chardet模組Python
- Python中模組的使用Python
- python 安裝模組的方法Python
- Java中類的成員方法和變數的訪問許可權Java變數訪問許可權