我对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'>
任何人都可以提供的任何指示都将非常感激:)
谢谢!
答案 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
因此,你有apple
,orange
等等,这些都是成果。
如果您不需要共同的祖先,您可以从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")()