Свойство Python упрощает присвоение значений атрибутам из класса Python. Соответствующие методы получения или установки автоматически вызываются при использовании свойства Python.
Что такое свойство Python и для чего оно используется?
Свойства Python — это программная конструкция, которую разработчики могут использовать в объектно-ориентированном программировании на Python. Программисты могут использовать его для определения методов, к которым затем можно получить доступ как к атрибутам. Это обеспечивает более интуитивный доступ к атрибутам класса, а также избавляет от необходимости вызывать специальные методы установки и получения. Свойства Python превращают атрибуты класса в свойства, называемые «управляемыми атрибутами».
Кроме того, свойство Python реализует своего рода контроль доступа: с помощью свойств можно гарантировать, что другие методы не смогут просто получить доступ к данным атрибута и изменить их нежелательным образом.
Функция Python property()
Разработчики могут использовать функцию Python property() для использования свойств. Это встроенная функция, которую можно использовать без импорта дополнительных модулей. Сам Python property() реализован на языке программирования C, что гарантирует оптимальную производительность.
Синтаксис свойства Python() следующий:
Параметры функции property() являются необязательными. В следующей обзорной таблице вы можете узнать, что означают отдельные параметры:
| Параметр | Значение |
| fget | Функция, возвращающая значение атрибута (метод геттера) |
| fset | Функция, позволяющая установить значение атрибута (метод setter) |
| fdel | Функция, определяющая, как атрибут должен быть удален |
| doctor | Строка Python, описывающая свойство |
Декоратор свойств Python
Использование функции property() не обязательно для работы со свойствами. Часто используется предопределенный в Python ((Python Decorator|11RARDEGE91861)), который позволяет вам использовать метод из вашего класса в качестве свойства. Язык программирования поддерживает три разных декоратора в известной нотации @, так что вы можете определить свойство:
- @property: помечает метод вашего класса как свойство Python.
- @.setter: указывает метод установки, который устанавливает значение свойства.
- @.deleter: указывает метод, удаляющий свойство.
Пример свойства Python
Подробный пример кода помогает проиллюстрировать как функциональность, так и преимущества свойств Python. В следующем разделе кода мы сначала создадим класс «Собака» с атрибутом «_name». Следует признать, что этот пример очень построен и не имеет реального применения; тем не менее, это хороший способ проиллюстрировать, как работают свойства Python.
class Hund: def __init__(self): self._name = "Bello"
Вы можете видеть, что конструктор не получает параметр, указывающий имя нашей собаки. Вместо этого имя собаки по умолчанию имеет значение «Bello». Например, вы можете создать объект класса с помощью следующей строки кода:
Getter и Setter методы
Вы можете расширить свой класс с помощью определенных методов получения и установки. Это имеет смысл по нескольким причинам; Прежде всего, на этом этапе следует подчеркнуть ремонтопригодность кода и установку дополнительных функций. Поскольку имена по умолчанию являются строками, мы также хотим убедиться, что в нашем классе имя действительно передается в виде строки. Для этого мы пишем соответствующую логику функции в специальном методе установки и расширяем определение нашего класса выше:
class Hund: def __init__(self): self._name = "Bello" def getName(self): return self._name def setName(self, name): if isinstance(name, str): self._name = name else: return
В методе установки под названием «setName» оператор Python if-else используется для проверки того, является ли переданный параметр строкой. В этом случае имя устанавливается, иначе ничего не происходит.
Мы также указали геттер-метод, который возвращает собачий хамен.
Объект нашего класса с именем «Lassie» можно создать следующим образом:
lassie = Hund() lassie.setName("Lassie") print(lassie.getName())
Вывод выглядит так и, следовательно, также по желанию:
Функция свойства Python ()
Чтобы вы могли обойтись без явного вызова функции, если хотите изменить или узнать имя вашей собаки Python, мы теперь используем свойство Python. В демонстрационных целях мы также включаем оператор печати в наш метод получения и установки.
class Hund: def __init__(self): self._name = "Bello" def getName(self): print("Getter-Methode aufgerufen") return self._name def setName(self, name): if isinstance(name, str): self._name = name print("Setter-Methode aufgerufen") else: return name = property(getName, setName)
Как видите, все, что нам нужно было сделать для вызова функции property(), — это создать новый атрибут с именем «name» (на этот раз без начального подчеркивания, потому что свойство Python позволяет легко обращаться к нему извне) и присвоить результат вызова нашей функции. Функция property() получает знакомые методы получения и установки в качестве параметров.
Если вы сейчас создадите еще один объект класса под названием «Snoopy», вы уже увидите разницу:
snoopy = Hund() snoopy.name = "Snoopy" snoopy.name
Теперь к атрибутам класса можно легко получить доступ, используя знакомую точечную нотацию. Вывод программы особенно интересен:
Setter-Methode aufgerufen Getter-Methode aufgerufen 'Snoopy'
Методы getter и setter, хотя и не вызывались явно, выполнялись в тот момент, когда имя объекта Snoopy присваивалось или извлекалось с использованием записи через точку. Это благодаря свойству Python.
Декоратор свойств Python
Вы можете добиться того же эффекта, используя уже упомянутые декораторы функций. В этом случае пример кода выглядит так (обратите внимание, что два декорируемых метода теперь должны иметь одно и то же имя):
class Hund: def __init__(self): self._name = "Bello" @property def name(self): print("Setter-Methode aufgerufen") return self._name @name.setter def name(self, name): if isinstance(name, str): self._name = name print("Getter-Methode aufgerufen") else: return
Опять же, вы можете создать объект своего класса и установить и прочитать атрибут «имя», используя запись через точку:
struppi = Hund() struppi.name = "Struppi" struppi.name
Вывод не изменился по сравнению с использованием функции Python property():
Setter-Methode aufgerufen Getter-Methode aufgerufen 'Struppi'








