Как удалить свойство из объекта в Python

В этом уроке вы узнаете, как использовать класс 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'
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *