В 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]
Комментариев нет:
Отправить комментарий