Module (52%)
Section (67%)

Исследование классов

Что Вы можете узнать о классах в 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 }} ×