簡體   English   中英

如何使用python動態創建目錄中所有類的實例?

[英]How do I dynamically create instances of all classes in a directory with python?

我正在嘗試做這樣的事情:

from A.AA import Q, W
from A.AB import E
from A.B.ABA import R
from A.B.ABB import T, Y, U

objs = []
objs.append(Q())
objs.append(W())
objs.append(E())
objs.append(R())
objs.append(T())
# and so on...

上面的代碼非常大,每次添加新的類或模塊時,都會花費大量不必要的時間來更新它。 相反,我想要一種從目錄和所有嵌套目錄中的每個類動態初始化對象的方法。 可以抽象為以下內容的東西。

objs = []
for py_file in directory:
    for class in py_file:
        objs.append(construct_object_of_type(class))

附帶說明,所有這些類都繼承自單個基類。 該代碼也將從頂層目錄中的python文件中調用。

如果要實例化所有導入的對象,則可以使用內置的global()函數通過全局名稱空間訪問它們。

from A.AA import Q, W
from A.AB import E
from A.B.ABA import R
from A.B.ABB import T, Y, U

instances = [obj() for name, obj in globals().items() if not name.startswith('__')]

還要注意,基本上一次創建所有實例不是一個好主意,一個原因是您可能不想全部使用它們,而另一個可能是將特定參數傳遞給每個實例的構造函數的問題(或某些)類,或者如果您有一些不想實例化的導入對象,那么也必須照顧它們,以及另一個問題。

所以我設法弄清楚該怎么做。

這是它的代碼:

import os
import imp
import inspect

obj_list = []

dir_path = os.path.dirname(os.path.realpath(__file__))
pattern = "*.py"

for path, subdirs, files in os.walk(dir_path):
    for name in files:
        if fnmatch(name, pattern):
            found_module = imp.find_module(name[:-3], [path])
            module = imp.load_module(name, found_module[0], found_module[1], found_module[2])
            for mem_name, obj in inspect.getmembers(module):
                if inspect.isclass(obj) and inspect.getmodule(obj) is module:
                    obj_list.append(obj())

暫無
暫無

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

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