我是python的新手,我认为有类似的问题(包括这个问题:Can you use a string to instantiate a class in python?),但我不明白答案或如何应用它们。
我正在尝试使用列表中的“实例名称”创建类的多个实例。
以下是我正在尝试做的一个例子:
class InstanceNames():
def __init__(self):
self.names = ['inst1', 'inst2', 'inst3']
class DoSomething():
instances = []
def __init__(self):
DoSomething.instances.append(self)
instance_names = InstanceNames()
for x in range(len(instance_names.names)):
print x
# following line not working at creating instances of DoSomething
instance_names.names[x] = DoSomething()
print DoSomething.instances
我更改了循环列表,现在我得到以下输出:
0
1
2
[<__main__.DoSomething instance at 0x10cedc3f8>, <__main__.DoSomething instance at 0x10cedc440>, <__main__.DoSomething instance at 0x10cedc488>]
有效吗?我很困惑,我不确定。
确定。这是一些丑陋的代码,但这就是我现在所拥有的:
class InstanceNames():
def __init__(self):
self.i_names = {'inst1': None, 'inst2': None, 'inst3': None}
self.o_names = ['foo', 'bar', 'baz']
class DoSomething():
instances = []
def __init__(self, blah_blah):
DoSomething.instances.append(self)
self.name = blah_blah
def testy(self, a):
a = a * 2
instance_names = InstanceNames()
for x in range(len(instance_names.i_names)):
print x
instance_names.i_names[x] = DoSomething(instance_names.o_names[x])
print "\n"
print DoSomething.instances
print "\n"
for y in DoSomething.instances:
print y.name
print y.testy(4)
print "\n"
这是我的输出:
0
1
2
[<__main__.DoSomething instance at 0x10dc6c560>, <__main__.DoSomething instance at 0x10dc6c5a8>, <__main__.DoSomething instance at 0x10dc6c5f0>]
foo
None
bar
None
baz
None
为什么'name'变量打印,但'testy'方法不是?
答案 0 :(得分:1)
你似乎在问“如何取字符串'inst1'并创建一个名为'inst1'的变量”。
答案是你不想这样做。而是创建一个字典或列表,将字符串映射到相关对象。有关示例,请参阅this question。
(如果那不是你要求的,请澄清你的问题。)
答案 1 :(得分:1)
并不是说我知道你真正想要做什么,为了解决你的特定代码,列表只是一组值。你正在对待它的是一个字典,它是一个关键和价值之间的联系。
要使您的示例有效,您可以使用dict:
class InstanceNames():
def __init__(self):
self.names = {'inst1': None, 'inst2': None, 'inst3': None}
这将允许以下表达式成功:
instance_names.names[x] = DoSomething()
...因为names
现在是一个字典,你正在访问一个密钥并为其分配一个值。
再次,我做了免责声明,我不知道这个代码试图做什么......感觉它可能不好......但是没有采取判断它的角度。
答案 2 :(得分:1)
instance_names.names
是list,需要数字作为索引。事实上,你发布的TypeError说的是同样的事情。
但是,您希望使用instance_names.names[x]
中的字符串设置元素 - 其中x
是一个字符串。列表不允许这样做,您需要使用dictionary。
有几种方法可以解决您的问题:
您可以首先使用instance_names.names的字典。但是,您必须使用保留对象(如None
)作为尚未创建的实例的占位符:'self.names = {'inst1':无,'inst2':无,'inst3对于instance_names.names.keys()中的x,':无} , and you must iterate through the keys of the dictionary:
:`
您可以为实例使用单独的字典,并在循环中设置其内容:self.instances = {}
。 instance_names.instances[x] = ...
有关Python数据类型的进一步阅读,我建议Dive Into Python。
答案 3 :(得分:1)
您可以使用type
动态创建类:
type_names = ["Class1", "Class2", "Class3"]
storage = {}
for t in type_names:
storage[t] = type(t, (object, ), {"your": "instance", "attributes": "here"})
for type_name in storage:
print type_name, "=>", storage[type_name]
或者,如果您真正需要的是一堆属性,则可以使用collections.namedtuple
生成轻量级类。
当前所拥有的内容是创建DoSomething
类的三个实例并替换InstanceNames
类中names
类的字符串值({ 1}}具有DoSomething
的这三个实例的属性。
答案 4 :(得分:0)
or x
是什么意思?
self.names
在范围内不存在,请改用instance_names.names
。