Перевод материала подготовлен в рамках онлайн-курса "Python Developer. Basic".
Приглашаем всех желающих на двухдневный онлайн-интенсив «Разработка десктоп-приложения с помощью библиотеки Tkinter». На интенсиве получим начальные навыки бэкенд-разработки на Python, а также начнем разработку десктоп-приложения с помощью библиотеки Tkinter. По итогам 2х дней сможем создать инвестиционное приложение для просмотра актуальной цены на необходимые акции или валюту. Присоединяйтесь!
Функция property()
используется для определения свойств в классах.
Метод property()
обеспечивает интерфейс для атрибутов экземпляра класса. Он инкапсулирует атрибуты экземпляров и предоставляет свойства, аналогично тому, как это работает в Java и C#.
Метод property()
принимает на вход методы get
, set
и delete
, и возвращает объекты класса property
.
Вместо метода property()
лучше использовать декоратор property
(https://www.tutorialsteacher.com/python/property-decorator).
Параметры:
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.
BasicWolf
ОТУС, ну зачем? Чем эта статья лучше краткого и лаконичного объяснения из docs.python.org?
Ну уж если писать статью, почему бы не раскрыть откуда и для чего в языке не ограничивающем доступ к полям класса появился этот функционал? Пример с
__name
ужасен по той простой причине, что в Питоне не принято обрамлять "_поле" или "__поле" в property просто так. Хотя этим любят заниматься товарищи пришедшие из Java и C#.Стоило бы отметить пару обыденных сценариев пользования
property
в Питоне:1. read-only property, которые возвращают фиксированное либо просчитанное значение. Например:
2. property in place of field - свойство ставится на месте обычного поля с сохранением имени. Таким образом сохраняется интерфейс класса, но при этом можно навесить дополнительную логику на операции чтении / записи поля.
MaxRokatansky Автор
Так мы ведь нигде и не говорим, что она лучше. Скорее просто еще один взгляд. И стоит заметить, что жто перевод, а не наша авторская статья, поэтому вносить какие-то дополнения в нее было бы не совсем правильно.
masai
Но ведь вы же выбираете, что переводить. Уверен, есть масса статей поинтереснее.
BasicWolf
Однозначно, как сказал @masai - вы же выбираете, что переводить! Человек, выбирающий подобный материал для перевода, мягко говоря профнепригоден. Он тратит время переводчика и время читателя впустую. Что хуже, в следующий раз увидев OTUS в тегах, читатель даже не станет заглядывать в статью. Пожалуйста, берите качеством, а не количеством.
MaxRokatansky Автор
Да, вы несомненно правы. Будем внимательнее относиться к подбору статей для перевода