Создание объекта класса путем введения значений из списка - PullRequest
0 голосов
/ 03 мая 2020

Я создал класс с именем 'My_class' и создал 4 объекта (obj1, obj2, obj3, obj4) следующим образом.

class My_class:
    def __init__(self, att1, att2, att3, att4, att5, att6):
        self.att1 = att1
        self.att2 = att2
        self.att3 = att3
        self.att4 = att4
        self.att5 = att5
        self.att6 = att6

    def __repr__(self):

        return "The values of the attributes are ({}, {}, {}, {}, {}, {})".format(self.att1, self.att2, self.att3, self.att4,
                                                                                    self.att5, self.att6)

obj1 = My_class(1, 2, 3, 4, 5, 6)
print(obj1)

obj2 = My_class(10, 20, 30, 40, 50, 60)
print(obj2)

# Lets say that I have 3 lists and I want to create the objects from the values of the lists.

list3 = ['a', 'b', 'c', 'd', 'e', 'f']
list4 = [-1, -2, -3, -4, -5, -6]
list5 = [-10, -20, -30, -40, -50, -60]

obj3 = My_class(list3[0], list3[1], list3[2], list3[3], list3[4], list3[5])
print(obj3)

obj4 = My_class(list4[0], list4[1], list4[2], list4[3], list4[4], list4[5])
print(obj4)

Вывод этого кода:

The values of the attributes are (1, 2, 3, 4, 5, 6)
The values of the attributes are (10, 20, 30, 40, 50, 60)
The values of the attributes are (a, b, c, d, e, f)
The values of the attributes are (-1, -2, -3, -4, -5, -6)

Я хотел бы создать obj5 со значениями list5, используя следующую структуру:

obj5 = My_class('introduce somehow the 6 values of list5 here without having to manually write them seperated by comas')

Это простой пример с использованием 6 атрибутов. Идея состоит в том, чтобы иметь компактный и эффективный способ сделать это в случае, если есть еще много атрибутов.

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

То, что @Samwise написал как комментарий, является правильным. Я просто хочу добавить, что если вы хотите инициализировать класс путем распаковки списка, возможно, вы делаете что-то не так.

В любом случае, если вы хотите это сделать, более безопасным вариантом является создание специального метода класса для что, как

@classmethod
def from_list(cls, l: list):
    # here you make sure that the length is ok etc
    return cls(*l)

И вы используете это так

obj = My_class.from_list(l)

Это более явно.

0 голосов
/ 03 мая 2020

Это то, что я бы сделал в это время.

class My_class:
    def __init__(self,*args):
        for i in range(0,len(args)):
            exec(f"self.att{i} = {args[i]}")
    def __repr__(self):
        return repr(self.__dict__)
0 голосов
/ 03 мая 2020

Это будет сделано:

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