Свойства

Свойства

Limera1n

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


У нас есть приватный атрибут race и он не виден извне, у нас есть защищенный атрибут health, и он тоже не виден извне. А что, если мы хотим сделать так, чтобы внешний код ничего не мог записать в health, но он мог бы прочитать его текущее значение, то же самое касается и race. Если мы просто уберем подчеркивания, то атрибут станет виден извне и кто угодно сможет туда записывать значения, а на данный момент они защищены соглашением программистов Python. Так как же дать доступ к чтению таких атрибутов? Сделать это можно с помощью свойств.

Объявим свойство:

Для объявления свойства мы используем декоратор @property, это именно на чтение. Свойство выглядит по синтаксису, как метод, только покрыто декоратором @property.

Теперь, если мы набираем c.+Tab, то видим, что у нас есть доступ к health и race, выведем значения и получим их:

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

Они защищены доступом через свойства.


Так же свойства можно и переназначать. Для этого мы можем использовать все тот же "проперти". Создадим новый атрибут current_speed и сделаем такое свойство:

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

Теперь используя такой синтаксис мы можем читать текущую скорость и перезаписывать ее в рамках дозволенного:

Report Page