Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

Как в Python 3 проинициализировать существующий класс в 1 строке свойствами вне конструктора, подобно c#?

В c# есть очень полезная конструкция. Если мне нужно создать экземпляр класса, а свойств, которые надо задать нет в конструкторе, то это можно делать в одной строке таким образом
var mc = new MyClass() { Prop1 = 1, Prop2 = "qwe" };
А можно подобное сделать в питоне?
Вообще требуется собрать список
list = [MyClass(el) for el in otherList]
Вот только проблема в том, что в конструктор MyClass ничего нельзя передать. Как мне в таком случае создать экземпляр и задать 1 или несколько свойств в одной строке?
UPD:
Вопрос похож на предыдущий, но вот те ответы меня не устраивают. Возможно, это потому что сам вопрос там был задан с меньшей конкретикой.
UPD2:
Ах да, вопрос все же отличается. Там человек спрашивает как повесить на автомат функцию инициализации класса, а я спрашиваю как использовать готовый класс, при этом ни намека на автоматику. В общем, советую внимательно вчитаться в оба вопроса, тогда все станет понятно


Ответ

Такого синтаксиса нет.

Но можно создать функцию хелпер:
def post_init(obj, **kwargs): for key, value in kwargs.items(): setattr(obj, key, value) return obj
И юзать её:
l = [post_init(MyClass(), el=el) for el in otherList]

А можно подменить __init__(вообще вариант не оч, но тоже можно):
def replace_init(cls): cls__init__ = cls.__init__ def my_init(self, el=None): cls__init__(self) self.el = el
cls.__init__ = my_init
replace_init(MyCLass)
И юзать такой класс:
l = [MyClass(el) for el in otherList]

Комментариев нет:

Отправить комментарий