Как я могу вернуть динамически созданные объекты класса?
У меня есть список строк 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 могут быть использованы для их получения.
Потрясающие.