- Оператор del и функция delattr() в Python
- delattr()
- Сравнение del и delattr()
- Атрибут удаления Python против установки на None
- Удаление уже удаленного атрибута
- Удаление несуществующего атрибута
- Как использовать delattr() в Python?
- Ошибки и исключения с delattr()
- Удаление атрибута с помощью оператора del
- Сравнение метода delattr() и оператора del
- How to Use the Python delattr() Function?
- Getting started with Python delattr() method
- Errors and Exceptions with delattr()
- Deleting attribute with Python del operator
- Python delattr() method v/s Python del operator
- Conclusion
- References
Оператор del и функция delattr() в Python
Оператор del и функция delattr() в Python используются для удаления атрибута объекта. Оба они делают одно и то же. Однако функция delattr() полезна, когда мы хотим удалить атрибут динамически, например, удаляя атрибут объекта на основе ввода данных пользователем.
Допустим, у нас есть класс Employee, определенный как:
class Employee: name = '' def __init__(self, i, n, r): self.id = i self.name = n self.role = r def __str__(self): return "Employee[id=<>, name=<>, role=<>]".format(self.id, self.name, self.role)
Обратите внимание, что id и name являются переменными класса, а role – переменной экземпляра.
Давайте посмотрим на пример использования оператора del для удаления атрибутов класса.
e = Employee(10, 'Pankaj', 'CEO') print(e) print(e.id) print(e.name) print(e.role) # del with class attribute del e.id print(e) print(e.id) del e.name print(e.name)
Employee[id=10, name=Pankaj, role=CEO] 10 Pankaj CEO Employee[id=-1, name=Pankaj, role=CEO] -1
Поэтому, когда мы удалили переменную класса с помощью оператора del, при дальнейшем доступе возвращается значение по умолчанию.
Теперь посмотрим, что происходит, когда мы пытаемся удалить переменную экземпляра, а затем получить к ней доступ.
AttributeError: 'Employee' object has no attribute 'role'
Поэтому, когда атрибут экземпляра удаляется, будущий доступ к ним вызывает AttributeError.
delattr()
Синтаксис delattr() в Python:
Первый аргумент – это объект, атрибут которого мы хотим удалить. Второй аргумент – это имя атрибута, который мы хотим удалить из объекта.
Давайте посмотрим на несколько примеров функции delattr().
e = Employee(10, 'Pankaj', 'CEO') print(e) print(e.id) print(e.name) print(e.role) delattr(e, 'id') print(e) print(e.id) delattr(e, 'name') print(e.name)
Employee[id=10, name=Pankaj, role=CEO] 10 Pankaj CEO Employee[id=-1, name=Pankaj, role=CEO] -1
Давайте посмотрим, что произойдет, когда мы попытаемся удалить переменную экземпляра role.
AttributeError: 'Employee' object has no attribute 'role'
Сравнение del и delattr()
Из приведенных выше примеров ясно, что оператор del и функция delattr() делают то же самое. Итак, когда использовать оператор del, а когда – функцию delattr()?
Если вы статически удаляете атрибут объекта в программе, имеет смысл использовать оператор del. Однако функция delattr() – единственный способ, когда вы хотите динамически назначить атрибут для удаления. Например, ввод данных пользователем для удаления атрибута объекта. Давайте посмотрим на это на простом примере.
# delattr() benefit with dynamic attribute deletion e = Employee(20, 'Lisa', 'Editor') print(e) attr = input('Please enter attribute to delete, valid values are id, name and role\n') delattr(e, attr) print(e)
Employee[id=20, name=Lisa, role=Editor] Please enter attribute to delete, valid values are id, name and role id Employee[id=-1, name=Lisa, role=Editor]
Обратите внимание, что я удаляю переменную класса. На изображении ниже показан результат, когда мы пытаемся удалить переменную экземпляра, а позже наша программа пытается получить к ней доступ.
Employee[id=20, name=Lisa, role=Editor] Please enter attribute to delete, valid values are id, name and role role Traceback (most recent call last): File "/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_del_delattr_examples.py", line 47, in print(e) File "/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_del_delattr_examples.py", line 11, in __str__ return "Employee[id=<>, name=<>, role=<>]".format(self.id, self.name, self.role) AttributeError: 'Employee' object has no attribute 'role'
Атрибут удаления Python против установки на None
Если вы хотите повторно использовать атрибут, вы можете установить для него значение None. Однако, если вы удалите атрибут экземпляра, вы получите ошибку при доступе к нему, если вы не установите его снова.
# set to None vs del/delattr e.role = None print('Role =', e.role) del e.role e.role = 'CEO' print('Role =', e.role)
Удаление уже удаленного атрибута
Если мы попытаемся удалить уже удаленный атрибут, мы получим AttributeError.
e = Employee(20, 'Lisa', 'Editor') del e.id # del e.id # AttributeError: id delattr(e, 'name') # delattr(e, 'name') # AttributeError: name
Удаление несуществующего атрибута
Если мы попытаемся удалить несуществующий атрибут объекта, мы получим AttributeError.
# del e.x # AttributeError: x # delattr(e, 'x') # AttributeError: x
Как использовать delattr() в Python?
В объектно-ориентированном программировании Class — это сущность, которая обертывает атрибуты и поведение и представляет их с помощью Object .
Функция класса существует в Python, поскольку это объектно-ориентированный язык. При создании атрибутов и определении поведения мы можем столкнуться с ситуациями, когда мы захотим удалить определенные атрибуты класса, в этом поможет delattr().
The delattr() function используется для удаления атрибута, связанного с определенным классом.
class Info: name = "AskPython" lang = "Python" site = "Google" obj = Info() print(obj.name) delattr(Info, 'lang')
Далее, мы создали объект класса Info, используя следующую команду:
После создания объекта мы удалили атрибут — lang с помощью функции delattr().
Ошибки и исключения с delattr()
После удаления атрибута, если мы попытаемся получить доступ к этому конкретному объекту, компилятор выдаст AttributeError .
class Info: name = "AskPython" lang = "Python" site = "Google" obj = Info() delattr(Info, 'lang') print(obj.lang)
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 5 obj = Info() 6 delattr(Info, 'lang') ----> 7 print(obj.lang) AttributeError: 'Info' object has no attribute 'lang'
Удаление атрибута с помощью оператора del
del operator также может использоваться для удаления атрибута класса напрямую, без доступа к нему через объект.
del Class-name.attribute-name
class Info: name = "AskPython" lang = "Python" site = "Google" print("Attribute before deletion:\n",Info.lang) del Info.lang print("Attribute after deletion:\n",Info.lang)
Attribute before deletion: Python --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 5 print("Attribute before deletion:\n",Info.lang) 6 del Info.lang ----> 7 print("Attribute after deletion:\n",Info.lang) AttributeError: type object 'Info' has no attribute 'lang'
Сравнение метода delattr() и оператора del
Метод delattr() более эффективен, чем оператор del в Python, с точки зрения динамического удаления атрибутов.
С другой стороны, оператор del выполняет операцию с более высокой скоростью по сравнению с методом delattr().
How to Use the Python delattr() Function?
Hey, readers! In this article, we will be focusing Python delattr() function.
Getting started with Python delattr() method
In Object Oriented Programming, a Class is an entity that wraps the attributes and the behavior and represents the same using an Object .
The feature of a class does exist in Python as it is an object-oriented language. While creating attributes and defining the behavior, we may come across situations wherein we would want to delete certain attributes of a Python class. This is when Python delattr() comes in the picture.
The delattr() function is used to delete an attribute associated with a particular class.
class Info: name = "AskPython" lang = "Python" site = "Google" obj = Info() print(obj.name) delattr(Info, 'lang')
In the above example, we have created a class Info with the attributes as follows:
Further, we have created an object of class ‘Info‘ using the below command:
After creating an object, we have deleted the attribute – ‘lang‘ using delattr() function.
Errors and Exceptions with delattr()
After having deleted an attribute, if we try to access that particular object, the compiler will throw AttributeError .
class Info: name = "AskPython" lang = "Python" site = "Google" obj = Info() delattr(Info, 'lang') print(obj.lang)
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 5 obj = Info() 6 delattr(Info, 'lang') ----> 7 print(obj.lang) AttributeError: 'Info' object has no attribute 'lang'
Deleting attribute with Python del operator
Python del operator can also be used to delete the attribute of class directly without accessing it through an object.
del Class-name.attribute-name
class Info: name = "AskPython" lang = "Python" site = "Google" print("Attribute before deletion:\n",Info.lang) del Info.lang print("Attribute after deletion:\n",Info.lang)
Attribute before deletion: Python --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 5 print("Attribute before deletion:\n",Info.lang) 6 del Info.lang ----> 7 print("Attribute after deletion:\n",Info.lang) AttributeError: type object 'Info' has no attribute 'lang'
Python delattr() method v/s Python del operator
Python delattr() method is more efficient that Python del operator in terms of dynamic deletion of the attributes.
On the other side, Python del operator executes the operation at a higher speed as compared to Python delattr() method.
Conclusion
Thus, in this article, we have understood the deletion of attribute through Python delattr() method and del operator.