Как я могу вернуть динамически созданные объекты класса?

У меня есть список строк 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 ответа

Решение

Я думаю, что вы можете быть озадачены значением "переменных" и "имен" в 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() толковый словарь.

Ваш вопрос все еще неясен, потому что вы не показываете код с задачей, которую хотите выполнить и где вы застряли. Вероятно, лучший способ сделать то, что я думаю, что вы пытаетесь сделать (хотя не обязательно, как делать то, что вы хотите сделать), это использовать dict:

>>> 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>
>>> 

Вы хотите сказать, что хотите создать список объектов без имен? Просто сделайте что-то вроде этого:

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

Затем вы можете получить доступ к каждому объекту с помощью myObjs[0], myObjs[1], так далее.

Также ознакомьтесь с руководством по Python, чтобы ознакомиться с основами создания экземпляров классов, списков и т. Д. В Python.

Изменить: то, что вы описываете в комментарии (создание переменной с заданным именем) не очень хорошая идея. Не имеет смысла создавать динамическое имя переменной, потому что вы не можете использовать его в коде, не зная, что такое имя переменной. Лучше использовать список или диктовать. Для слова, вы можете сделать что-то вроде:

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

А затем делайте это так часто, как вы хотите, добавляя новые объекты к myObjs,

Как я решил проблему:

Я решил использовать свойство класса под названием "экземпляры", к которому я добавляю все вновь созданные экземпляры. Это может быть дикт или список. Строка или индекс int могут быть использованы для их получения.

Потрясающие.

Другие вопросы по тегам