Объявление переменной в стиле Java в классе

#python #coding-style #variable-declaration

#python #стиль кодирования #объявление переменной

Вопрос:

Я пытаюсь понять лучшие практики в ООП Python.

Я очень хорошо знаком с рабочим процессом в стиле Java:

  1. Объявление атрибута
  2. Создание экземпляра атрибута

Что мне нравится в этом, так это то, что, на мой взгляд, это улучшает читаемость: бегло взглянув на атрибуты, вы точно знаете, с чем будете работать в классе.

Я хотел бы добиться того же результата в Python, хотя я понимаю, что в Python нет такого понятия, как «объявление переменной», но, возможно, какой-то шаблон проектирования, который позволил бы сделать то же самое.

До сих пор моим промежуточным решением было «объявить» внутри __init__ метода с:

 def __init__(self):
    self.attribute1 = None
    self.attribute2 = None 
  

и создавайте экземпляры этих элементов позже в последующих методах.
Но я нахожу это довольно уродливым, и я был бы очень рад услышать о более элегантном шаблоне.

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

1. Установка атрибутов в классе делает их атрибутами класса, а не атрибутами экземпляра.

2. Да, большое вам спасибо!

3. Помните, что вы можете согласиться, нажав на галочку рядом с ответом, и это даст вам плюс 2 к вашей репутации. 🙂

Ответ №1:

Лучшее место для объявления ваших входных данных — внутри строки документации вашего класса:

 class Foo(object):
    '''
    This class of object is instantiated with variables that are attributes:

    attribute1 should be a string
    attribute2 should be a tuple of length two for your parameters:
    '''
    def __init__(attribute1=None, attribute2=None): 
        self.attribute1 = attribute1
        self.attribute2 = attribute2
  

И когда кто-то вызывает help(Foo) , будет напечатана строка документа. Это будет создано и на него будут ссылаться:

 help(Foo)
my_foo = Foo('bar', ('baz', 42))
help(my_foo)
  

И обратите внимание, что, поскольку мы предоставили атрибутам значение None по умолчанию, мы можем создать экземпляр объекта без указанных атрибутов и проверить их создание позже с is None помощью .

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

1. Здесь есть хороший пример строк документации в стиле Google.

Ответ №2:

В Python 3.x вы можете использовать «Аннотации функций» для добавления метаданных к аргументам и возвращаемым значениям:

 class Demo():

    def __init__(self, attribute1: str, attribute2: "int - number of foos" = 0):
        self.attribute1 = attribute1
        self.attribute2 = attribute2

    def foo(self) -> int:
        return self.attribute2
  

Они не применяются принудительно (без сторонних библиотек), но предоставляют полезную информацию пользователям ваших классов (например, отображаются в виде всплывающих подсказок в IDE и в информации, предоставленной help(Demo) ).