Я сочувствую вашему чувству, что стандартный код - это плохо. Но в этом случае я не уверен, что даже может быть лучшая альтернатива. Давайте рассмотрим возможности.
Если вы говорите только о нескольких переменных, тогда последовательность из self.x = x
строк легко читается. На самом деле, я думаю, что его четкость делает этот подход предпочтительным с точки зрения читабельности. И хотя набирать текст может быть немного больно, одного этого недостаточно для оправдания новой языковой конструкции, которая может затенить то, что происходит на самом деле. Конечно, использование vars(self).update()
shenanigans было бы более запутанным, чем это стоит в этом случае.
С другой стороны, если вы передаете девять, десять или более параметров в __init__
, вам, вероятно, все равно придется провести рефакторинг. Таким образом, эта проблема действительно относится только к случаям, в которых передается, скажем, 5-8 параметров. Теперь я вижу, как восемь строк self.x = x
будут раздражать как печатать, так и читать; но я не уверен, что случай с 5-8 параметрами является достаточно распространенным или хлопотным, чтобы оправдать использование другого метода. Поэтому я думаю, что, хотя обеспокоенность, которую вы поднимаете, в принципе является хорошей, на практике существуют и другие ограничивающие проблемы, которые делают ее неактуальной.
Чтобы сделать этот пункт более конкретным, давайте рассмотрим функцию, которая принимает объект, dict и список имен и присваивает значения из dict именам из списка. Это гарантирует, что вы по-прежнему четко указываете, какие переменные присваиваются self. (Я бы никогда не предложил решение этой проблемы, которое не требовало бы явного перечисления переменных, которые должны быть назначены; это был бы магнит редкоземельного элемента):
>>> def assign_attributes(obj, localdict, names):
... for name in names:
... setattr(obj, name, localdict[name])
...
>>> class SomeClass():
... def __init__(self, a, b, c):
... assign_attributes(self, vars(), ['a', 'b', 'c'])
Теперь, хотя и не ужасно непривлекательно, это все же сложнее понять, чем прямая серия self.x = x
линий. Кроме того, вводить больше, чем одну, две, а может быть, даже три или четыре строки, в зависимости от обстоятельств, гораздо сложнее. Таким образом, вы получаете только определенную отдачу, начиная с случая с пятью параметрами. Но это также точный момент, когда вы начинаете приближаться к пределу человеческой кратковременной памяти (= 7 +/- 2 "порции"). Так что в этом случае ваш код уже немного сложен для чтения, и это только сделает его более сложным.