如何取回动态创建的类对象?

时间:2012-12-21 19:56:45

标签: python qt python-2.7 pyqt pyside

我有一个字符串列表 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() 

3 个答案:

答案 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 = 11对象没有任何作用,只是增加了它的引用计数。

变量是字符串到命名空间内对象的映射。命名空间用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来检索它们。

真棒。