Python-通过模块属性(按字符串名称)访问类实例
好吧,让我尽力解释一下。假设我有一个叫做Foobar的类:Python-通过模块属性(按字符串名称)访问类实例,python,class,attributes,module,instance,Python,Class,Attributes,Module,Instance,好吧,让我尽力解释一下。假设我有一个叫做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实例。现在,我的最终
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种可能性中选择一种,我会给它们贴上标签
所以我想将他们的选择存储在db中(但我只想存储标签,它表示Foobar类的一个特定实例)。这样我就可以抓住我需要的实例
因此,我尝试在这样的模块中设置所有实例(我们称之为“my_instances.py”)
这样,一旦我从db中得到代表他们选择的字符串,我就可以像这样抓取该实例(我忽略了如何获取字符串,但展示了如何获取实例)
我得到一个TypeError:必须使用Foobar实例作为第一个参数调用未绑定的方法doIt()
看来我得到了Foobar,但不是一个真正的例子。任何帮助都将不胜感激。我相信我已经对我的场景做了充分的解释,您可以看到一个更简单的解决方案,我正在尝试做什么,请提出建议。我无法重现您的错误(使用来自foobar import foobar的
),所以您的代码中似乎有一些东西没有显示给我们。但无论如何,最好不要进行动态查找。为什么不创建一个返回foobars dict的工厂函数呢
def get_foobars(x, y, z):
foobars = {}
foobars["label_one"] = Foobar(x, y, z)
foobars["label_two"] = Foobar(z, y, x)
...
或者,如果您不希望函数每次都创建新的Foobar
foobars = {}
foobars["label_one"] = Foobar(...
def get_foobars():
return foobars
或者更简洁地说
foobars = {'label_one':Foobar("eenie", "meenie", "miney"),
'label_two':Foobar(...),
... }
我无法重现您的错误(使用foobar import foobar中的),因此您的代码中似乎有一些东西没有显示给我们。但无论如何,最好不要进行动态查找。为什么不创建一个返回foobars dict的工厂函数呢
def get_foobars(x, y, z):
foobars = {}
foobars["label_one"] = Foobar(x, y, z)
foobars["label_two"] = Foobar(z, y, x)
...
或者,如果您不希望函数每次都创建新的Foobar
foobars = {}
foobars["label_one"] = Foobar(...
def get_foobars():
return foobars
或者更简洁地说
foobars = {'label_one':Foobar("eenie", "meenie", "miney"),
'label_two':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()
动态符号查找可能很聪明,但不一定更清晰。正如注释所示,类和模块之间可能存在名称冲突
但是,明确定义查找表可能更清晰:
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()
动态符号查找可能很聪明,但并不一定更清晰。@payne的查找表创建了十个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
makeFooLookup = {
"first": ("eenie", "meenie", "miney"),
"second": ("teeny", "toonie", "tiny"),
"third": ("biggie", "baggie", "boogie")
}
def makeFoo(label, lookup=makeFooLookup):
return Foobar(*lookup[label])
@payne的查找表创建了十个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
makeFooLookup = {
"first": ("eenie", "meenie", "miney"),
"second": ("teeny", "toonie", "tiny"),
"third": ("biggie", "baggie", "boogie")
}
def makeFoo(label, lookup=makeFooLookup):
return Foobar(*lookup[label])
从Foobar import Foobar中尝试我可能显示得不好,但是没有名为Foobar的模块,只有从Foobar import Foobar中尝试我可能显示得不好,但是没有名为Foobar的模块,只有一个类可以解释最后一行中的星号是做什么的?它将元组解压成单独的参数,这样Foobar.\uu init\uuuu接收foo=“eenie”,bar=“meenie”,choo=“miney”而不是foo=tuple(“eenie”,“meenie”,“miney”),bar=!缺少论点!,choo=!缺少论点!你能解释一下最后一行中的星号是做什么的吗?它将元组解压成单独的参数,这样Foobar.\uu init\uuuu接收foo=“eenie”,bar=“meenie”,choo=“miney”而不是foo=元组(“eenie”,“meenie”,“miney”),bar=!缺少论点!,choo=!缺少论点!