Кодирование метода Python: нормально ли локальное имя, ссылающееся на атрибут, чтобы избежать повторения self.attribute?

#python #attributes #coding-style #self

#python #атрибуты #стиль кодирования #self

Вопрос:

Представьте, что у вас есть очень важный атрибут в классе Python, так что метод будет ссылаться на него много раз. Например,

 class BeautifulDiagram(Object)
   def draw(self):
        # c is the drawing canvas (ReportLab), we use it many times
        self.c.setLineWidth(0.5 * mm)
        self.c.setStrokeColor('grey')
        ....

  

Было бы хорошей практикой — или нет — избегать написания большого количества атрибутов self.c в приведенном выше примере, путем создания локальной ссылки на него, например

    c = self.c
   c.setLineWidth(0.5 * mm)
   c.setStrokeColor('grey')
  

Есть ли какая-либо причина избегать этого (afaik, это работает), либо потому, что это противоречит рекомендациям по кодированию, либо неэффективно (я не думаю, что это большое бремя, учитывая, что оно копирует только ссылки на атрибуты)?
Есть ли что-нибудь еще лучше?

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

1. То, что у вас есть, в порядке. Однако Дзен Python предполагает, что явное лучше, чем неявное. Кроме того, остерегайтесь, что позже у вас может возникнуть соблазн выполнить метод c = <new canvas> , который не сработает. Вы должны сделать self.c = <new canvas> .

2. Спасибо. Я полностью понимаю, что c = <new canvas> было бы неуместно, так как это просто установило бы переменную c как относящуюся к новому объекту, не изменяя тот, на который он ранее ссылался. Итак, быть Дзен в Python означает повторять довольно много self.something?

3. Вы всегда можете применить Закон Деметры и иметь def setupCanvas(self, c): c.setLine...

4. Может кто-нибудь сказать мне, почему вопрос теперь оценивается как «-1»? Кто решил, что это «бесполезно»? Если оно останется таким, я просто удалю его, но я подумал, что вопрос и потенциальные ответы были полезны (хотя первый комментарий, по крайней мере, выиграет от публикации в качестве ответа, учитывая, что комментарии не предназначены для предоставления ответов).

5. Технически этот вопрос не по теме, поскольку он запрашивает мнения.

Ответ №1:

То, что у вас есть, в порядке. Однако Дзен Python предполагает, что явное лучше, чем неявное, поэтому вы обнаружите, что стиль вашего первого фрагмента довольно распространен.

Кроме того, остерегайтесь в своем втором фрагменте, что у вас может возникнуть соблазн позже в методе сделать c = <new canvas> то, что не сработает. Вы должны сделать self.c = <new canvas>

Есть еще один вариант, который заключается в применении Закона Деметры и:

     def draw(self):
        self.setupCanvas(self.c)

    def setupCanvas(self, c): 
       c.setLineWidth(0.5 * mm)
       c.setStrokeColor('grey')
       ...