Исследование классов
Что Вы можете узнать о классах в Python? Ответ прост - все.
Как отражение, так и интроспекция позволяют программисту делать что угодно с каждым объектом, независимо от того, откуда он.
Проанализируйте код в редакторе.
Функция с именем incIntsI()
получает объект любого класса, сканирует его содержимое, чтобы найти все целочисленные атрибуты с именами, начинающимися с i и увеличивает их на единицу.
Невозможно? Вовсе нет!
Вот как это работает:
- строка 1: определение очень простой класса...
- строки с 3 по 10: ... и заполнение его некоторыми атрибутами;
- строка 12: это наша функция!
- строка 13: сканирование атрибута
__dict__
, поиск имен всех атрибутов; - строка 14: если имя начинается с i...
- строка 15: ...использование функции
getattr()
, чтобы получить ее текущее значение; примечание:getattr()
принимает два аргумента: объект и имя его свойства (в виде строки) и возвращает значение текущего атрибута; - строка 16: проверка, имеет ли значение тип integer, и использует для этого функцию
isinstance()
(мы обсудим это позже); - строка 17: если проверка прошла успешно, увеличение значение свойства, используя функцию
setattr()
; функция принимает три аргумента: объект, имя свойства (в виде строки) и новое значение свойства.
Вывод кода:
{'a': 1, 'integer': 4, 'b': 2, 'i': 3, 'z': 5, 'ireal': 3.5}
{'a': 1, 'integer': 5, 'b': 2, 'i': 4, 'z': 5, 'ireal': 3.5}
output
Вот и все!
Code
class MyClass:pass
obj = MyClass()
obj.a = 1
obj.b = 2
obj.i = 3
obj.ireal = 3.5
obj.integer = 4
obj.z = 5
def incIntsI(obj):
for name in obj.__dict__.keys():
if name.startswith('i'):
val = getattr(obj, name)
if isinstance(val, int):
setattr(obj, name, val + 1)
print(obj.__dict__)
incIntsI(obj)
print(obj.__dict__)
{{ dockerServerErrorMsg }}
×
{{ errorMsg }}
×
{{ successMsg }}
×