Access to instance variable, but not instance method in Python
我是Python的新手,我认为有人问过类似的问题(包括这个问题:你能用字符串来实例化Python中的类吗?)但是我不明白答案或者如何应用它们。
我正在尝试使用列表中的"实例名称"创建一个类的多个实例。
下面是我要做的一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
我更改了循环的列表,现在得到了以下输出:
1 2 3 4 | 0 1 2 [<__main__.DoSomething instance at 0x10cedc3f8>, <__main__.DoSomething instance at 0x10cedc440>, <__main__.DoSomething instance at 0x10cedc488>] |
它起作用了吗?我很困惑,我不确定。
好啊。这是一些难看的代码,但我现在有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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" " print DoSomething.instances print" " for y in DoSomething.instances: print y.name print y.testy(4) print" " |
以下是我的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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"方法不是?
可以使用
1 2 3 4 5 6 7 | 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] |
或者,如果您真正需要的只是一堆属性,那么可以使用
您当前拥有的是创建三个
但是,您希望使用
有几种方法可以解决您的问题:
您可以首先使用字典,例如"name.names"。但是,您必须使用保留对象(如
您可以为实例使用单独的字典,并在循环中设置其内容:
为了进一步了解python的数据类型,我建议深入了解python。
我不知道您真正想做什么,为了解决您的特定代码,列表只是一个值的集合。您对待它的方式是听写,它是键和值之间的关联。
为了使您的示例有效,您将使用dict:
1 2 3 | class InstanceNames(): def __init__(self): self.names = {'inst1': None, 'inst2': None, 'inst3': None} |
这将允许以下表达式成功:
1 | instance_names.names[x] = DoSomething() |
…因为
再次声明,我不知道这段代码在做什么…感觉可能不好…但不是从判断的角度。
您似乎在问"我如何获取字符串'inst1'并生成一个名为'inst1'的变量"。
答案是你不想这样做。相反,创建一个字典或列表,将字符串映射到相关对象。有关一些示例,请参阅此问题。
(如果这不是你要问的,请澄清你的问题。)
这是什么意思,
范围内不存在