Мы знаем, что можно присвоить значение переменной класса через конструктор и объектную функцию. Но помимо этого есть еще один альтернативный способ: метод setattr().
Что такое функция setattr() в Python?
Функция setattr() в Python — это встроенная функция, которая создает и устанавливает значение данного атрибута объекта класса. Метод setattr() может присвоить None любому атрибуту объекта и может использоваться для инициализации нового атрибута объекта.
Синтаксис
|
1 |
setattr(object, name, value) |
Аргументы
Функция использует следующие три параметра:
- object: это объект, чей атрибут должен быть установлен или изменен.
- name: это строка, содержащая имя устанавливаемого атрибута.
- value: значение, которое должно быть установлено.
Возвращаемое значение
Функция ничего не возвращает. Таким образом, возвращаемое значение равно None.
Программа, показывающая, как работает setattr()
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# app.py # Creating a class of name Student class Student: # Creating class attributes name = "Debasis" roll = 24 # creating class object std = Student() # Printing data before using setattr() print("Name is : ", std.name) print("Roll no is: ", std.roll) # Now we will modify student's roll no setattr(std, 'roll', 20) # Printing data after modification print("\nAfter modification: ") print("Name is : ", std.name) print("Roll no is: ", std.roll) |
Выход:
|
1 2 3 4 5 6 7 8 |
➜ pyt python3 app.py Name is : Debasis Roll no is: 24 After modification: Name is : Debasis Roll no is: 20 ➜ pyt |
В приведенном выше примере мы видим, что мы изменили значение номера рулона с 24 на 20 с помощью метода setattr(), и после этого, когда мы его вызываем, мы можем увидеть измененное значение.
Когда атрибут имени не найден и для него установлено значение «None»
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# app.py # Creating a class of name Student class Student: # Creating class attributes name = "Debasis" roll = 24 # creating class object std = Student() # Printing data before using setattr() print("Name is : ", std.name) print("Roll no is: ", std.roll) # Here we will set name to None setattr(std, 'name', None) # Now we will set value to an attribute # Which is not present in class setattr(std, 'section', 'CSE171') # Printing data after modification print("\nAfter modification:") print("Name is : ", std.name) print("Roll no is: ", std.roll) print("Section is : ", std.section) |
Выход:
|
1 2 3 4 5 6 7 8 9 |
➜ pyt python3 app.py Name is : Debasis Roll no is: 24 After modification: Name is : None Roll no is: 24 Section is : CSE171 ➜ pyt |
В приведенном выше примере мы установили значение атрибута name равным None, поэтому мы можем узнать, что мы также можем присвоить значение None.
С другой стороны, как мы видим, в классе Student нет атрибута section, но мы использовали его в setattr().
В данном случае произошло следующее: функция setattr() сама создает новый атрибут, если этот атрибут отсутствует в классе, а затем присваивает ему заданное значение.
Python setattr() с пользовательским вводом
Мы используем функцию Python input(), чтобы получить ввод от пользователя и передать это значение функции setattr().
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# app.py class Student: pass stud = Student() attr_name = input('Enter the attribute name:\n') attr_value = input('Enter the attribute value:\n') setattr(stud, attr_name, attr_value) print('Data attribute =', attr_name, 'and its value =', getattr(stud, attr_name)) |
Выход:
|
1 2 3 4 5 6 7 |
➜ pyt python3 app.py Enter the attribute name: character_name Enter the attribute value: Eleven Data attribute = character_name and its value = Eleven ➜ pyt |
Исключение функции setattr()
Мы можем создать атрибут только для чтения, используя функцию property или декоратор свойств в объекте.
В этом случае, если мы попытаемся установить значение атрибута с помощью функции setattr(), мы получим AttributeError: невозможно установить исключение атрибута.
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# app.py class Student: def __init__(self): self._name = None def get_name(self): print('get_name called') return self._name # for read-only attribute name = property(get_name, None) stud = Student() setattr(stud, 'name', 'Krunal') |
Выход:
|
1 2 3 4 5 6 |
➜ pyt python3 app.py Traceback(most recent call last): File "app.py", line 16, in <module> setattr(stud, 'name', 'Krunal') AttributeError: can't set attribute ➜ pyt |
