我有一个字符串列表 my_list ,其中包含n个项目。 此列表在运行时期间输入一个字符串。 假设现在有4个项目。
示例:my_list = ['one','two','three','four']
我有一个名为 my_object 的自定义对象,其中我需要使用循环创建的实例,列表中的每个项目。
我的问题:
通常,我创建对象为**my_obj** = MyObj()
,我可以使用 my_obj 变量来获取它并调用其方法等。
因为我需要使用列表操作动态地进行这种创建;
我知道它已经过时了,可能是错误的并且已经过时但是在VisualBasic中可视化项目可能会执行如下操作:
my_obj [dyanmic_variable] = ...
我不希望这涉及全局或任何事情都很复杂。
我该如何处理这个问题?
更多背景信息:
*我正在使用Qt(PySide - PyQt)开发一个应用程序。 我有一个自定义的小部件(my_class) 我需要使用动态创建的此对象实例填充可视列表(QGridLayout),然后调用它们的方法。*
谢谢。
显示我正在创建对象并尝试使用它们的代码:
class my_class(object):
def __init__(self):
print 'hi'
def talk(w):
print w
my_list = ['one', 'two']
### code that won't work starts from here
for i in list:
i = my_class()
my_list[1].talk()
答案 0 :(得分:3)
你只是说要创建一个没有名字的对象列表吗?做这样的事情:
myObjs = [MyObj() for i in range(5)]
然后,您可以使用myObjs[0]
,myObjs[1]
等
另外,请阅读the Python tutorial以熟悉在Python中创建类实例,列表等的基础知识。
编辑:您在评论中描述的内容(创建具有给定名称的变量)不是一个好主意。创建动态变量名称没有意义,因为如果不知道变量名称是什么,就不能在代码中使用它。最好使用列表或字典。对于词典,您可以执行以下操作:
myObjs = {}
theName = getNameSomehowFromUser()
myObjs[theName] = MyObj()
然后根据需要随时进行,将新对象添加到名为myObjs
的dict中。
答案 1 :(得分:1)
我认为你可能会对Python中“变量”和“名称”的含义感到困惑。
对象没有名称。说foo = 1
对1
对象没有任何作用,只是增加了它的引用计数。
变量是字符串到命名空间内对象的映射。命名空间用dicts实现。您可以使用locals()
函数访问本地名称空间。
示例:
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> a = 1
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'a': 1, '__package__': None}
>>>
请注意{a}:1出现在locals()
字典中。
您的问题仍然不明确,因为您没有显示任何代码,包含您要完成的任务以及您遇到的问题。做我认为你想做的事情的最佳方式(尽管没有必要如何做你想做的事情)可能是使用词典:
>>> class MyClass(object): pass
...
>>> myobjects = {}
>>> myobjects['key-name'] = MyClass()
>>> myvar = myobjects['key-name'] # some time later...
>>> myvar # what is myvar?
<__main__.MyClass object at 0x10f7c1c50>
>>> myobjects['key-name'] # myobjects['key-name'] is the same object
<__main__.MyClass object at 0x10f7c1c50>
>>>
答案 2 :(得分:0)
我是如何解决这个问题的:
我决定使用一个名为'instances'的类属性,我追加所有新创建的实例。这可以是字典或列表。然后可以使用字符串或索引int来检索它们。
真棒。