Skip to main content
 首页 » 编程设计

Python之通过模块属性(按字符串名称)访问类实例

2025年05月04日31exmyth

好的,让我尽力解释一下。假设我有一个名为 Foobar 的类:

class Foobar(): 
    def __init__(self, foo, bar, choo): 
        self.foo = foo 
        self.bar = bar 
        self.choo = choo 
 
    def doIt(self): 
        return self.foo + self.bar 

并且我想要一组 10 种可能的 Foobar 实例,我将在我的应用程序中使用它们。现在我的最终用户不知道或不关心 foo、bar 和 choo 的值,但想从 10 种可能性中选择一种,我将对其进行标记。

所以我想将他们的选择存储在数据库中(但我只想存储标签,它代表 Foobar 类的特定实例)。这样我就可以获取我需要的实例。

所以我尝试像这样在一个模块中设置我的所有实例(我们称之为“my_instances.py”)

import Foobar 
 
label_one = Foobar("eenie", "meenie", "miney") 
label_two = Foobar("teeny", "toony", "tiny") 
... 
label_ten = Foobar("biggie", "boogie", "baggie") 

这样,一旦我从数据库中获得代表他们选择的字符串,我就可以像这样获取该实例(我忽略了您将如何获取字符串,但展示了我是如何获取实例的)。

import my_instances 
 
my_object = getattr(my_instances, 'label_one') 
result = my_object.doIt() 

我收到类型错误:必须使用 Foobar 实例作为第一个参数调用未绑定(bind)方法 doIt()。

看来我得到了 Foobar,但不是它的真实实例。任何帮助将不胜感激。我相信我已经充分解释了我的场景,您看到了一个更简单的解决方法来解决我正在尝试做的事情,请提出建议。

请您参考如下方法:

正如评论所暗示的,您可能在 Foobar 类和 Foobar 模块之间存在名称冲突。

但是,显式定义一个查找表可能会更清楚:

foobars = { 
  'label_one': Foobar("eenie", "meenie", "miney"), 
  'label_two': Foobar("teeny", "toony", "tiny"), 
  ... 
  'label_ten': Foobar("biggie", "boogie", "baggie") 
} 

用法:

result = foobars['label_one'].do_it() 

动态符号查找可能很聪明,但不一定更清晰。