В этом уроке вы узнаете, как использовать класс property() в Python для удаления свойства из объекта.
Чтобы создать свойство класса, вы используете декоратор @property. Декоратор @property использует класс property, имеющий три метода: setter, getter и deleter.
Используя deleter, вы можете удалить свойство из объекта. Обратите внимание, что метод deleter() удаляет свойство объекта, а не класса.
Ниже определяется класс Person со свойством name:
from pprint import pprint
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if value.strip() == '':
raise ValueError('name cannot be empty')
self._name = value
@name.deleter
def name(self):
del self._name
В классе Person мы используем декоратор @name.deleter. Внутри средства deleter мы используем ключевое слово del для удаления атрибута _name экземпляра Person.
Ниже показан __dict__ класса Person:
pprint(Person.__dict__)
Выход:
mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
'__doc__': None,
'__init__': <function Person.__init__ at 0x000001DC41D62670>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'name': <property object at 0x000001DC41C89130>})
Класс Person.__dict__ имеет переменную name. Следующий код создает новый экземпляр класса Person:
person = Person('John')
У person.__dict__ есть атрибут _name:
pprint(person.__dict__)
Выход:
{'_name': 'John'}
В следующем примере используется ключевое слово del для удаления свойства name:
del person.name
Внутри Python выполнит метод deleter, который удаляет атрибут _name из объекта person. person.__dict__ будет пустым следующим образом:
{}
И если вы попытаетесь снова получить доступ к свойству name, вы получите сообщение об ошибке:
print(person.name)
Ошибка:
AttributeError: 'Person' object has no attribute '_name'
