1

我有一个字符串列表 my_list,其中包含 n 个项目。此列表在运行时逐个输入字符串。假设现在有 4 个项目。

示例:my_list = ['one', 'two', 'three', 'four']

我有一个名为my_object的自定义对象,我需要为list 中的每个项目创建一个循环的实例。

我的问题:通常,我将对象创建为:**my_obj** = MyObj()并且我可以使用my_obj变量来获取它并调用它的方法等。

由于我需要通过列表操作动态地进行此创建;

  • 如何创建对象实例?
  • 如何获取对象实例并调用其方法?

我知道它很旧,可能是错误的和过时的,但在 VisualBasic 中,对于视觉项目,这可能会像这样执行:

my_obj[动态变量] = ...

我不希望这涉及全局变量或任何东西变得复杂。

我该如何处理这个问题?

更多背景:

*我正在使用 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() 
4

3 回答 3

3

你只是说你想创建一个没有名字的对象列表吗?只需执行以下操作:

myObjs = [MyObj() for i in range(5)]

myObjs[0]然后您可以使用,myObjs[1]等访问每个对象。

此外,阅读Python 教程以熟悉在 Python 中创建类实例、列表等的基础知识。

编辑:您在评论中描述的内容(创建具有给定名称的变量)不是一个好主意。创建一个动态变量名是没有意义的,因为你不能在不知道变量名是什么的情况下在代码中使用它。最好使用列表或字典。对于 dict,您可以执行以下操作:

myObjs = {}
theName = getNameSomehowFromUser()
myObjs[theName] = MyObj()

然后随心所欲地执行此操作,将新对象添加到名为myObjs.

于 2012-12-21T20:02:58.873 回答
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>
>>> 
于 2012-12-21T20:20:06.917 回答
0

我是如何解决这个问题的:

我决定使用一个名为“instances”的类属性,我将所有新创建的实例都附加到该属性中。这可以是字典或列表。然后可以使用字符串或索引 int 来检索它们。

惊人的。

于 2012-12-21T20:19:30.033 回答