簡體   English   中英

使用 locate 動態實例化類

[英]Instantiate class dynamically with locate

我正在嘗試從提供給方法的字符串動態實例化一個類。

from pydoc import locate
name = "folder.subfolder.classname"
my_class = locate(name)
instance = my_class()

這樣做會導致錯誤:

TypeError: 'module' object is not callable

我的問題是:我如何動態地知道我需要調用哪個類? 如果我對值進行硬編碼並執行my_class.classname()我可以實例化它,但我希望最后一部分是動態的,而不是硬編碼。 我怎樣才能做到這一點?

編輯2:

該解決方案將收集用戶提供的模塊中所有可用的類,然后簡單地實例化第一個類。

import inspect
from pydoc import locate
name = "folder.subfolder.classname"
my_module = locate(name)

all_classes = inspect.getmembers(my_module, inspect.isclass)
if len(all_classes) > 0:
    instance = all_classes[0][1]()

編輯:

從評論中收集到的我相信以下代碼適用於您的用例:

from pydoc import locate
name = "folder.subfolder.classname"
my_module = locate(name)
class_name = name.rsplit('.')[-1]
my_class = getattr(my_module, class_name)
instance = my_class()

您似乎對哪些模塊導致了我們的誤會感到有些困惑。 class.py 不指向類,而是指向模塊。 在該模塊(您的 class.py 文件)中可以有多個類。 對於上面的答案,我只是假設在您的 class.py 文件中,您有一個與該文件同名的類。

原答案:

正如您的錯誤所示,您的my_class變量實際上是一個模塊對象。 您提供的名稱實際上並不指向您的類,而是指向包含該類的模塊。

要通過字符串從模塊對象中獲取類,您可以執行以下操作:

my_class = getattr(module, class_name)

然后就像在您的示例代碼中一樣,您可以像這樣實例化它:

instance = my_class()

把它們放在一起:

module_name = "folder.subfolder.module_name"
my_module = locate(module_name)
my_class = getattr(my_module, class_name)
instance = my_class()

您沒有在文件中找到該類:

from pydoc import locate
name = "folder.subfolder.filename.classname"
my_class = locate(name)
instance = my_class()

暫無
暫無

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

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