Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-通过模块属性(按字符串名称)访问类实例_Python_Class_Attributes_Module_Instance - Fatal编程技术网

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

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实例。现在,我的最终

好吧,让我尽力解释一下。假设我有一个叫做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=!缺少论点!