Свойство Python: как неявно вызывать методы получения и установки?

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

Свойство Python упрощает присвоение значений атрибутам из класса Python. Соответствующие методы получения или установки автоматически вызываются при использовании свойства Python.

Что такое свойство Python и для чего оно используется?

Свойства Python — это программная конструкция, которую разработчики могут использовать в объектно-ориентированном программировании на Python. Программисты могут использовать его для определения методов, к которым затем можно получить доступ как к атрибутам. Это обеспечивает более интуитивный доступ к атрибутам класса, а также избавляет от необходимости вызывать специальные методы установки и получения. Свойства Python превращают атрибуты класса в свойства, называемые «управляемыми атрибутами».

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

Функция Python property()

Разработчики могут использовать функцию Python property() для использования свойств. Это встроенная функция, которую можно использовать без импорта дополнительных модулей. Сам Python property() реализован на языке программирования C, что гарантирует оптимальную производительность.

Синтаксис свойства Python() следующий:

property(fget=None, fset=None, fdel=None, doc=None)

Параметры функции property() являются необязательными. В следующей обзорной таблице вы можете узнать, что означают отдельные параметры:

Параметр Значение
fget Функция, возвращающая значение атрибута (метод геттера)
fset Функция, позволяющая установить значение атрибута (метод setter)
fdel Функция, определяющая, как атрибут должен быть удален
doctor Строка Python, описывающая свойство

Декоратор свойств Python

Использование функции property() не обязательно для работы со свойствами. Часто используется предопределенный в Python ((Python Decorator|11RARDEGE91861)), который позволяет вам использовать метод из вашего класса в качестве свойства. Язык программирования поддерживает три разных декоратора в известной нотации @, так что вы можете определить свойство:

  • @property: помечает метод вашего класса как свойство Python.
  • @.setter: указывает метод установки, который устанавливает значение свойства.
  • @.deleter: указывает метод, удаляющий свойство.
Читайте также:  Как изменится мобильная разработка в 2024 году - новые тренды, технологии и прогнозы

Пример свойства Python

Подробный пример кода помогает проиллюстрировать как функциональность, так и преимущества свойств Python. В следующем разделе кода мы сначала создадим класс «Собака» с атрибутом «_name». Следует признать, что этот пример очень построен и не имеет реального применения; тем не менее, это хороший способ проиллюстрировать, как работают свойства Python.

class Hund:
	def __init__(self):
		self._name = "Bello"

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

hund = Hund()

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())

Вывод выглядит так и, следовательно, также по желанию:

'Lassie'

Функция свойства 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() получает знакомые методы получения и установки в качестве параметров.

Читайте также:  Введение в CONSTRAINT в PostgreSQL - Исчерпывающее руководство для новичков

Если вы сейчас создадите еще один объект класса под названием «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'

Оцените статью
Блог о программировании
Добавить комментарий