我有以下奇怪的設定。考慮不同目錄中的 3 個腳本:
- root1/檔案夾A/scriptA.py
- root2/檔案夾B/scriptB.py
- root2/檔案夾C/scriptC.py
第一個檔案及其位置是完全可修改的。第二個和第三個是完全固定的。
scriptA.py 包含一個父類:
class A:
def get_path(self):
# ...
# code to determine "my_path"
# ...
return my_path
scriptB.py 包含一個子類:
from root1.folderA.scriptA import A
class B(A):
pass
scriptC.py 包含要執行的代碼:
from root2.folderB.scriptB import B
if __name__ == "__main__":
b = B()
print(b.get_path()) # want print root/folderB/scriptB.py
在 scriptC.py 中,我想要的是獲取子類宣告檔案路徑的行為(沒有任何硬編碼)。有沒有什么辦法可以A.get_path()對這種行為進行編程?
我試過研究inspect,os.path和pathlib模塊,但我沒有任何運氣。
uj5u.com熱心網友回復:
看起來訣竅是使用__init_subclass__which 在類被子類化時運行,結合類的__module__屬性來檢索其包含的模塊,并__file__檢索到 python 腳本或模塊的絕對路徑。
例如,在script_a.py:
import sys
from pathlib import Path
class PathInfo:
__slots__ = ()
path: Path
def __init_subclass__(cls, **kwargs):
mod = sys.modules[cls.__module__]
# `__file__` is a string, so we want to convert to a `Path` so it's easier to work with
cls.path = Path(mod.__file__)
class A(PathInfo):
__slots__ = ()
script_b.py:
from script_a import A
class B(A):
pass
# prints: /Users/<name>/PycharmProjects/my-project/script_a.py
print(A().path)
# prints: /Users/<name>/PycharmProjects/my-project/script_b.py
print(B.path)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483357.html
