Могу / должен ли я реализовать методы Python путем присвоения атрибутам?

#python #coding-style

#python #стиль кодирования

Вопрос:

Есть ли какие-либо стилистические табу или другие недостатки в реализации тривиальных методов путем присвоения атрибутам класса? Например, как bar и baz ниже, в отличие от более привычных foo .

 class MyClass(object):
    def hello(self):
        return 'hello'
    def foo(self):
        return self.hello()
    bar = lambda self: self.hello()
    baz = hello
  

Я нахожу себя соблазненным очевидной экономией подобных вещей:

 __str__ = __repr__ = hello
  

Ответ №1:

Лично я думаю, что такие вещи, как

 __str__ = __repr__ = hello
  

все в порядке, но

 bar = lambda self: self.hello()
  

это зло. Вы не можете легко присвоить лямбде строку docstring, и .func_name атрибут будет иметь бессмысленное значение <lambda> . Обе эти проблемы не возникают для первой строки.

Ответ №2:

В общем, совершенно нормально присваивать методам другие имена. Однако во многих случаях это hello должно было быть __str__ в первую очередь (если hello не возвращает строку в определенном формате или около того).