передавать атрибуты объектов, которые находятся в одном списке, в другой список - PullRequest
1 голос
/ 06 августа 2020

Я работаю над проектом, в котором, в зависимости от потребностей клиента, я создаю несколько объектов (одного класса), затем они сохраняются в списке, а затем атрибуты созданных объектов должны быть сохранены в другом списке, чтобы распечатать их в текстовом файле. Мне удалось создать несколько объектов и сохранить их в одном списке, но я не могу получить доступ к имеющимся у них атрибутам и сохранить их в другом списке.

Создание объектов:

list_obj = [] 
for i in range (10):
    obj = sensorUltrasonido("verde", 0, 3)
    list_obj.append(obj)

Теперь вопрос в том, как я могу сохранить атрибуты этих 10 объектов, созданных в другом списке, или получить к ним доступ?

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Вам нужно создать второй список и просто добавить к нему атрибуты, к которым можно получить доступ, вызвав dir(obj). Мы проигнорируем частные атрибуты, исключив те, которые начинаются с "_". Например:

list_obj = []  
list_attrs = []
for i in range (10):
    obj = sensorUltrasonido("verde", 0, 3)
    list_obj.append(obj)
    attrs = [attr for attr in dir(obj) if not str(attr).startswith("_")]
    list_attrs.append(attrs)

После этого вы можете использовать свои списки для записи в текстовый файл.

Обратите внимание, что вместо хранения двух списков, заполненных [obj, ...] и [attrs, ...], Вариант будет иметь один список [(obj, attrs), ...], потому что тогда связь между этими элементами будет более ясной.

Теперь, если вам нужно сохранить имена и значения атрибутов, мы будем использовать словарь вместо этого:

attrs = {attr: getattr(obj, attr) for attr in dir(obj) if not str(attr).startswith("_")}

Для тестирования я создаю класс:

class sensorUltrasonido():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

и print(list_attrs) дает нам:

[{'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}, {'x': 'verde', 'y': 0, 'z': 3}]
0 голосов
/ 06 августа 2020

Я не совсем понимаю, что вы имеете в виду, но, отказавшись от вашей формулировки, я предложу следующее. Каждый объект может иметь переменную списка в своей функции инициализации

class foo:
  def __init__(self, *args):

     self.argument_list = []
     for items in *args:
        self.argument_list.append(items)

Таким образом, все данные, переданные в аргументы, могут быть сохранены в списке для вашего объекта. Затем, когда вы создаете новый объект, вы всегда можете добавить его в глобальный список

object_arguments = []

F = Foo(Args)
object_arguments.append(F)

Чтобы получить доступ к аргументам объекта в этом массиве, это так же просто, как сказать

object_arguments.argument_list[]

Затем для файла вы можете сделать следующее

file = open("arguments.txt","w")


for items in object_arguments:
  
     file.write(items.argument_list)

file.close()
0 голосов
/ 06 августа 2020

Поскольку вы используете объекты для сопоставления параметров в классе. Лучше go методами Magi c. вызывается dict , который возвращает словарь параметров в объекте. который можно использовать для получения необходимого параметра

class MyClass(object):
    class_var = 1

    def __init__(self, i_var):
        self.i_var = i_var

foo = MyClass(2)
bar = MyClass(3)

print MyClass.__dict__
print foo.__dict__
print bar.__dict__

, вывод будет

{'__module__': '__main__', 'class_var': 1, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None, '__init__': <function __init__ at 0x0000000004E55CF8>}
{'i_var': 2}
{'i_var': 3}

Надеюсь, вывод может помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...