Я разделяю ваше мнение о том, что шаблонный код — это плохо. Но в этом случае я не уверен, что может быть лучшая альтернатива. Рассмотрим возможности.
Если вы говорите всего о нескольких переменных, то легко читается последовательность из self.x = x
строк. Фактически, я думаю, что его явность делает этот подход предпочтительным с точки зрения удобочитаемости. И хотя печатать может быть немного неудобно, одного этого недостаточно, чтобы оправдать новую языковую конструкцию, которая может скрыть то, что на самом деле происходит. Конечно, использование vars(self).update()
махинаций в этом случае может привести к большей путанице, чем оно того стоит.
С другой стороны, если вы передаете девять, десять или более параметров в __init__
, вам, вероятно, все равно придется провести рефакторинг. Таким образом, эта проблема действительно относится только к случаям, когда требуется передать, скажем, 5-8 параметров. Теперь я вижу, как восемь строк self.x = x
будут раздражать как при вводе, так и при чтении; но я не уверен, что случай с 5-8 параметрами достаточно распространен или достаточно проблематичен, чтобы оправдать использование другого метода. Так что я думаю, что хотя проблема, о которой вы говорите, в принципе хорошая, на практике существуют другие ограничивающие факторы, которые делают ее неактуальной.
Чтобы конкретизировать этот момент, давайте рассмотрим функцию, которая принимает объект, словарь и список имен и присваивает значения из словаря именам из списка. Это гарантирует, что вы по-прежнему четко указываете, какие переменные присваиваются 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 "куска"). Итак, в этом случае ваш код уже немного сложен для чтения, и это только усложнит его.
person
senderle
schedule
30.12.2011
Ctrl+Space
PyDev автоматически заполнять эти атрибуты... такой позор... - person Jonathan   schedule 30.12.2011self
под тем же именем без преобразования. Я делаю вещи приватными, проверяю значения, нормализую их, заполняю изменяемые объекты, которые были бы значениями по умолчанию, если бы аргументы по умолчанию работали по-другому, и т. д. - person   schedule 30.12.2011