2012-08-29 165 views
0

我是新手到Python,我认为类似的问题已经被问(包括本:Can you use a string to instantiate a class in python?),但我不明白的答案或如何应用它们。访问实例变量,而不是实例方法在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 

为什么是“名”可变印刷,但“暴躁”的方法是不是?

+2

这不是列表的工作方式。 –

+0

谢谢。更改列表的for循环。仍然没有得到我想要的。会爱你的帮助。谢谢。 – dwstein

+1

'len(self.names)'应该是'len(instance_names.names)' –

回答

0

这是什么意思or x

self.names不存在的范围,使用instance_names.names代替。

1

您似乎在问:“我如何接收字符串'inst1'并创建一个名为'inst1'的变量”。

答案是你不想这样做。相反,创建一个字典或列表将字符串映射到有问题的对象。有关示例,请参阅this question

(如果这不是你问,请澄清你的问题。)

1

这并不是说我有什么想法,你真正要做的,以满足您的特定代码,表仅仅是一个集合值。你对它的看法是一个字典,它是一个关键和价值之间的联系。

为了使您的工作例如,你可以使用的字典:

class InstanceNames(): 
    def __init__(self): 
     self.names = {'inst1': None, 'inst2': None, 'inst3': None} 

现在,这将允许下面的表达式成功:

instance_names.names[x] = DoSomething() 

...因为names现在的字典和您正在访问一个密钥并为其分配一个值。

我再次声明,我不知道这段代码试图做什么...有这种感觉可能不是很好......但没有采取判断它的角度。

1

instance_names.nameslist需要数字作为指标。事实上,你发布的TypeError也是一样的。

但是,您想使用instance_names.names[x]中的字符串设置元素 - 其中x是一个字符串。列表不允许这样做,您需要使用dictionary

有几种方法来解决问题:

  1. 您可以使用字典instance_names.names摆在首位。然而,您必须使用一个保留的对象,例如None作为尚未创建的实例的占位符:'self.names = {'inst1':None,'inst2':None,'inst3':None} , and you must iterate through the keys of the dictionary: for example in instance_names.names.keys():`

  2. 您可以为实例使用单独的字典并在循环中设置其内容:self.instances = {}instance_names.instances[x] = ...

进一步阅读关于Python的数据类型,我建议Dive Into Python

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属性与DoSomething这三种情况下替换字符串值(不使用)。