簡體   English   中英

Python 的 importlib 並檢查靜態類成員

[英]Python's importlib and inspect for static class members

在長時間運行的應用程序中,我需要根據類模塊的路徑和類名動態修改靜態類成員。

前任。 我有一個類pack1.mod1.Person並且根據定義我知道它有一個age屬性。 因此,利用importlibinspect我嘗試使用模塊路徑和類名加載類並更新age屬性。 一切似乎都很好,直到我從我自然導入的Person類中讀取了age屬性並發現它沒有更新。

以下是更多詳細信息:

.
├── app.py
└── pack1
    ├── __init__.py
    └── mod1.py

模塊1.py

class Person:
    age = 42

應用程序

import inspect
import os
from importlib import util

from pack1.mod1 import Person

if __name__ == '__main__':
    Person.age = 3
    print(Person.age)  # => 3

    spec = util.spec_from_file_location('pack1.mod1', os.path.join('pack1', 'mod1.py'))
    module = util.module_from_spec(spec)
    spec.loader.exec_module(module)

    members = inspect.getmembers(module)

    for x, member in inspect.getmembers(module, lambda i: inspect.isclass(i) and i.__name__ == Person.__name__):
        print('Person:', Person.age)  # => Person: 3
        print('Person from inspect:', member.age)  # => Person from inspect: 42
        Person.age = 11
        member.age = 66
        print('Person:', Person.age)  # => Person: 11
        print('Person from inspect:', member.age)  # => Person from inspect: 66

app.py我希望memberPerson是同一件事,但正如示例所示,它們不是。

我錯過了什么以及如何對類的靜態成員進行這樣的更新?

Python 無法知道定期導入的模塊和手動模塊是“相同的”:使用util.spec_from_file_locationspec.loader.exec_module Python 的模塊注冊表並顯式創建模塊的新實例。
相反,使用解釋器的本機操作( import ,...)或其編程等效項( importlib.load_module ,...)

如果模塊/類是眾所周知的,可以定期import並直接檢查它。

import pack1.mod1
pack1.mod1.Person.age = 66

如果模塊和類僅通過名稱知道,則可以從現有模塊中查找它們。

import importlib

module_name, qualname, attribute, value = 'pack1.mod1', 'Person', 'age', 66

obj = importlib.import_module(module_name)  # same as `import {module_name}`
for part in qualname.split('.'):
    obj = getattr(obj, part)                # same as `{obj}.{part}

setattr(obj, attribute, value)              # same as `{obj}.{attribute} = {value}`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM