Меня немного смущает полезность синтаксиса python @*.getter
по сравнению с простым определением свойства без геттера.
Чтобы исследовать это, давайте напишем очень простой класс:
class Foo:
def __init__(self):
self._x = None
@property
def x(self):
print('Attribute `self.x` is a property.')
return self._x
@x.getter
def x(self):
print('Getting property `x`...')
return self._x
Теперь, если я попытаюсь создать экземпляр класса и получить свойство x
из экземпляра, мы увидим, что вызывается метод получения:
>>> A = Foo()
>>> print(A.x)
Getting property `x`...
None
Хорошо, и что? Это именно то, что мы должны ожидать.
Однако, если я определю точно такой же класс без любого метода получения, мы получим что-то другое:
>>> print(A.x)
Attribute `self.x` is a property.
None
Когда нет Метод getter определен, попытка получить свойство приводит к тому, что вместо этого вызывается метод определения свойства (я имею в виду метод, определенный в @property
, из-за отсутствия лучшего имени).
Интересно, что в В первом случае метод, определенный в @property
, на самом деле никогда не вызывается.
Итак, какой смысл иметь специальный метод получения, если исходное определение свойства, кажется, служит геттером в его отсутствие? Служит ли исходное определение какой-либо цели, кроме как просто сказать: «это свойство»? Существуют ли какие-либо другие обстоятельства, при которых этот метод будет вызван (кроме получения свойства при отсутствии геттера)? Почему вы решили использовать геттер вместо простого включения его функций в определение свойства?
Наконец, есть ли какие-либо варианты использования, когда можно было бы использовать метод определения свойства, который является более сложным, чем следующая каноническая форма, при использовании метода @*.getter
?
@property
def x(self): return self._x