#python #coding-style #variable-declaration
#python #стиль кодирования #объявление переменной
Вопрос:
Я пытаюсь понять лучшие практики в ООП Python.
Я очень хорошо знаком с рабочим процессом в стиле Java:
- Объявление атрибута
- Создание экземпляра атрибута
Что мне нравится в этом, так это то, что, на мой взгляд, это улучшает читаемость: бегло взглянув на атрибуты, вы точно знаете, с чем будете работать в классе.
Я хотел бы добиться того же результата в 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)
).