Свойства (@property) объектов
@property декоратор может быть использован для определения методов в классе , которые действуют как атрибуты. Одним из примеров, где это может быть полезно, является предоставление информации, которая может потребовать первоначального (дорогостоящего) поиска и простого поиска после этого.
Учитывая некоторый модуль foobar.py :
class Foo(object): def __init__(self): self.__bar = None @property def bar(self): if self.__bar is None: self.__bar = some_expensive_lookup_operation() return self.__bar
from foobar import Foo foo = Foo() print(foo.bar) # Это займет некоторое время, так как # bar после инициализации имеет значение None. # 42 print(foo.bar) # Это намного быстрее, так как bar # теперь имеет значение # 42
Использование декоратора @property для свойств чтения-записи
Если вы хотите использовать @property для реализации пользовательского поведения для установки и получения, использовать этот шаблон:
class Cash(object): def __init__(self, value): self.value = value @property def formatted(self): return '$'.format(self.value) @formatted.setter def formatted(self, new): self.value = float(new[1:])
Чтобы использовать это:
wallet = Cash(2.50) print(wallet.formatted) # $2.50 print(wallet.value) # 2.5 wallet.formatted = '$123.45' print(wallet.formatted) # $123.45 print(wallet.value) # 123.45
Переопределение только метода получения, установки или удаления объекта свойства
При наследовании от класса со свойством, вы можете предоставить новую реализацию одного или несколько свойства getter , setter или deleter функций, с помощью ссылки на объекте собственности на родительском классе:
class BaseClass(object): @property def foo(self): return # some_calculated_value() @foo.setter def foo(self, value): return # do_something_with_value(value) class DerivedClass(BaseClass): @BaseClass.foo.setter def foo(self, value): return # do_something_different_with_value(value)
Вы также можете добавить установщик или удалитель, если раньше его не было в базовом классе.
Использование свойств без декораторов
Хотя использование синтаксиса декоратора (с @) удобно, оно также немного скрыто. Вы можете использовать свойства напрямую, без декораторов. Следующий пример Python 3.x показывает это:
class A: p = 1234 def getX (self): return self._x def setX (self, value): self._x = value def getY (self): return self._y def setY (self, value): self._y = 1000 + value # Странно, но можно def getY2 (self): return self._y def setY2 (self, value): self._y = value def getT (self): return self._t def setT (self, value): self._t = value def getU (self): return self._u + 10000 def setU (self, value): self._u = value - 5000 x, y, y2 = property (getX, setX), property (getY, setY), property (getY2, setY2) t = property (getT, setT) u = property (getU, setU) A.q = 5678 class B: def getZ (self): return self.z_ def setZ (self, value): self.z_ = value z = property (getZ, setZ) class C: def __init__ (self): self.offset = 1234 def getW (self): return self.w_ + self.offset def setW (self, value): self.w_ = value - self.offset w = property (getW, setW) a1 = A() a2 = A() a1.y2 = 1000 a2.y2 = 2000 a1.x = 5 a1.y = 6 a2.x = 7 a2.y = 8 a1.t = 77 a1.u = 88 print(a1.x, a1.y, a1.y2) # 5 6 1000 print(a2.x, a2.y, a2.y2) # 7 8 2000 print(a1.p, a2.p, a1.q, a2.q) # 1234 1234 5678 5678 print(a1.t, a1.u) # 77 88 b = B() c = C() b.z = 100100 c.z = 200200 c.w = 300300 print(a1.x, b.z, c.z, c.w) # 5 100100 200200 300300 c.w = 400400 c.z = 500500 b.z = 600600 print(a1.x, b.z, c.z, c.w) # 5 600600 500500 400400
Класс property() в Python, метод класса как свойство
Класс property() позволяет использовать методы в качестве вычисляемых свойств объектов (дескрипторов данных).
Если задана строка doc , то она будет строкой атрибута свойства. В противном случае строка документации будет скопирована из функции fget , если она существует.
Типичное использование класса property() — определить дескриптор (управляемый атрибут) x :
class C: def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.")
Если c является экземпляром C , то:
- c.x вызовет метод getx ,
- c.x = value вызовет setx ,
- del c.x вызовет delx .
Используя класс property() в качестве декоратора @property можно легко создавать вычисляемые свойства только для чтения:
class Parrot: def __init__(self): self._voltage = 100000 @property def voltage(self): """Get the current voltage.""" return self._voltage p = Parrot() p.voltage = 220 # AttributeError del p.voltage # AttributeError
Объект декоратора @property также имеет методы getter , setter и deleter , которые можно так же использовать в качестве декораторов. Эти декораторы удобно использовать с функциями, которые реализуют выше указанные свойства.
Это лучше всего объяснить на примере:
class C: def __init__(self): self._x = None @property def x(self): # В декораторах 'setter' и 'deleter' нужно указывать имя метода-свойства """I'm the 'x' property.""" return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
Этот код в точности соответствует первому примеру. Обязательно присваивайте дополнительным методам (под декораторами setter и deleter ) то же имя, что и у исходного метода-свойства.
Изменено в Python 3.5: Добавлена возможность установки строки документации для объекта-свойства
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Функция property() в Python
Перевод материала подготовлен в рамках онлайн-курса «Python Developer. Basic«.
Приглашаем всех желающих на двухдневный онлайн-интенсив «Разработка десктоп-приложения с помощью библиотеки Tkinter». На интенсиве получим начальные навыки бэкенд-разработки на Python, а также начнем разработку десктоп-приложения с помощью библиотеки Tkinter. По итогам 2х дней сможем создать инвестиционное приложение для просмотра актуальной цены на необходимые акции или валюту. Присоединяйтесь!
Функция property() используется для определения свойств в классах.
Метод property() обеспечивает интерфейс для атрибутов экземпляра класса. Он инкапсулирует атрибуты экземпляров и предоставляет свойства, аналогично тому, как это работает в Java и C#.
Метод property() принимает на вход методы get , set и delete , и возвращает объекты класса property .

- fget : (опционально) Функция для получения значения атрибута. Значение по умолчанию None.
- fset : (опционально) Функция для задания значения атрибута. Значение по умолчанию None.
- fdel : (опционально) Функция для удаления значения атрибута. Значение по умолчанию None.
- doc : (опционально) Строка, содержащая документацию. Значение по умолчанию None.
Возврат значений:
Возвращает атрибут свойства из заданных геттера, сеттера и функции удаления.
Следующий пример показывает, как создать свойство в Python с помощью функции property() .
class person: def __init__(self): self.__name='' def setname(self, name): print('setname() called') self.__name=name def getname(self): print('getname() called') return self.__name name=property(getname, setname)
В примере выше property(getname, setname) возвращает объект свойства и присваивает ему имя. Таким образом, свойство name скрывает приватный экземпляр __name . Доступ к свойству name осуществляется напрямую, но внутри вызывается метод getname() или setname() , как показано ниже.
>>> from person import person >>> p1=person() >>> p1.name="Steve" setname() called >>> p1.name getname() called 'Steve'
Как видно выше, метод getname() вызывается автоматически, когда мы обращаемся к свойству name . Аналогично метод setname вызывается, когда мы присваиваем значение свойству name . Он скрывает атрибут класса __name .
Аналогично можно написать метод удаления свойства, как в коде ниже.
class person: def __init__(self, name): self.__name=name def setname(self, name): print('setname() called') self.__name=name def getname(self): print('getname() called') return self.__name def delname(self): print('delname() called') del self.__name # Set property to use get_name, set_name # and del_name methods name=property(getname, setname, delname)
Функция delname() будет вызвана, когда вы удалите свойство name .
>>> from person import person >>> p1=person() >>> p1.name="Steve" setname() called >>> del p1.name delname() called
Таким образом, мы можем определить свойство в классе с помощью функции property() в Python.
Декоратор @property упрощает объявление свойства и позволяет сделать это не вызывая функцию property() .
Узнать подробнее о курсе «Python Developer. Basic«
Регистрация на двухдневный онлайн-интенсив «Разработка десктоп-приложения с помощью библиотеки Tkinter»: День 1, День 2.
Что такое property python
![]()
Декоратор @property в Python: как использовать в коде
23 марта 2023
Оценки статьи
Еще никто не оценил статью
Декоратор @property в Python является мощным инструментом для создания геттеров и сеттеров для атрибутов класса. В этой статье мы рассмотрим, что такое декоратор @property , как он работает и как его можно использовать для создания геттеров и сеттеров.
Что такое декоратор @property() в Python?
Декоратор @property используется для определения метода, который можно вызывать, как если бы он был атрибутом. Это позволяет нам обращаться к методу без вызова его, как обычной функции. Декоратор @property обычно используется для определения методов доступа к атрибутам класса. Например, мы можем определить методы getter и setter для атрибута класса, чтобы получить и установить его значение.
Как работает декоратор @property() в Python?
Декоратор @property создает свойство объекта, которое может быть использовано для доступа к атрибуту класса. Когда мы обращаемся к свойству объекта, Python вызывает соответствующий метод, определенный декоратором @property .
Для определения методов доступа к атрибутам класса мы можем использовать декораторы @property.getter и @property.setter .
Метод @property.getter используется для получения значения атрибута, а метод @property.setter используется для установки его значения.
Примеры использования декоратора @property() в Python
Пример 1: Создание свойства объекта
Декоратор @property позволяет нам создавать свойства объекта. Например, мы можем создать класс Rectangle с атрибутами width и height . Затем мы можем определить метод area , который возвращает площадь прямоугольника.
class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): return self._width * self._height r = Rectangle(10, 5) print(r.area) # Output: 50
Здесь метод area определен с помощью декоратора @property . Когда мы обращаемся к свойству area объекта r , Python вызывает метод area, который возвращает площадь прямоугольника.
Пример 2: Использование методов доступа к атрибутам
Декоратор @property также может использоваться для определения методов доступа к атрибутам класса. Например, мы можем определить класс Person с атрибутами name и age . Затем мы можем определить методы доступа name и age с помощью декораторов @property.getter и @property.setter .
class Person: def __init__(self, name, age): self._name = name self._age = age @property def name(self): return self._name @name.setter def name(self, value): self._name = value @property def age(self): return self._age @age.setter def age(self, value): self._age = value p = Person("John", 25) print(p.name) # Output: John print(p.age) # Output: 25 p.name = "Alex" p.age = 30 print(p.name) # Output: Alex print(p.age) # Output: 30
Здесь методы name и age определены с помощью декоратора @property.getter . Методы name.setter и age.setter используются для установки значений атрибутов.
Заключение
Декоратор @property позволяет нам создавать свойства объектов и определять методы доступа к атрибутам класса. Он очень полезен, когда мы хотим скрыть детали реализации атрибутов и предоставить удобный интерфейс для доступа к ним.
Меню категорий
-
Загрузка категорий.
Добро пожаловать в Блог Разработчика Владислава Александровича.
Ведется медленная, но уверенная разработка функционала сайта.
Django Core: 0.3.4 / Next.js 1.0 / UPD: 05.06.2023
