使用变量为其名称实例化一个类

时间:2014-04-11 11:20:49

标签: python variables for-loop instantiation

我对Python有点新意,希望有人能够帮我解决我遇到的问题。

我需要使用列表中的变量来实例化多个对象。让我们说我有一个包含2个项目的列表,[" apple"," orange"]我希望将这些用作基于类Fruit的实例化类的名称,所以我最终得到了两个对象,苹果和橘子,它们都属于Fruit类。

我尝试过这样做,但我似乎无法弄清楚如何使用变量名作为实例化类的名称。这段代码不起作用,但可能会让您对我想要实现的目标有所了解:

class Fruit:
    pass

my_list = ["apple", "orange"]

for item in my_list:
    item = Fruit()

type(apple)

这不起作用,但我希望这可以让您了解我想要实现的目标。我收到这个错误:

NameError: name 'apple' is not defined

我希望看到的是:

>>> type(apple)
<type 'instance'>

任何人都可以提供的任何指示都将非常感激:)

谢谢!

2 个答案:

答案 0 :(得分:3)

动态创建变量通常不是一个好主意。只需使用字典:

>>> fruits = {}
>>> for item in my_list:
...    fruits[item] = Fruit()
... 

>>> [(k, type(v)) for k, v in fruits.items()]
[('orange', <class '__main__.Fruit'>), ('apple', <class '__main__.Fruit'>)]

我想你可以通过玩globals()在全球范围内做类似的事情,但我认为这是非常糟糕的做法。

答案 1 :(得分:0)

非常简单,首先让你的基地成为一个新式的课程:

class Fruit(object):
    pass

然后动态创建您希望的任何子类:

Apple = type("Apple", (Fruit, ), dict())

然后实例化它:

anapple = Apple()

type(anapple)
__main__.Apple

因此,你有appleorange等等,这些都是成果。

如果您不需要共同的祖先,您可以从object派生您的新课程:

Apple = type("Apple", (object, ), dict())

最后,如果您已经动态或静态地定义了这些类,您可以像这样查看它们,第1部分,相同的模块:

class Apple: pass
class Orange: pass

for name in ["Orange", "Apple"]:
    instance = globals()[name]()

在这里,globals是一个函数,因此首先(),它返回一个字典,然后你在这个字典中查找你的水果,然后[],然后你得到一个班级,用()实例化它。

最后,如果你的所有成果都在某个模块中定义,例如:

# fruits.py
class Apple: pass
class Orange: pass

# user code
import fruits
anapple = getattr(fruits, "Apple")()