Написать метакласс AnnoCalc, который добавляет в конструируемый с его помощью класс такое свойство: если (1) в классе есть аннотация к полю, (2) самого поля у экземпляра/класса нет, и (3) эта аннотация — строка, то при чтении из этого поля строка-аннотация интерпретируется как выражение с участием других полей объекта/класса. Выражение вычисляется и возвращается соответствующее значение. Если какое-то из условий (1), (2), (3) не выполнено, класс ведёт себя стандартно (добывает имеющееся значение поля или вызывает исключение). Исключение происходит также в случае, когда в «выражении с участием других полей» встречается имя, которого среди полей класса/экземпляра нет.

   1 class C(metaclass=AnnoCalc):
   2     A: int = 123
   3     B: int = 2
   4     C: "A * B + 1"
   5 
   6     def __init__(self, A):
   7         self.A = A
   8 
   9 c = C(23)
  10 print(c.A, c.B, c.C)
  11 c.A = 100
  12 c.B = 3
  13 print(c.A, c.B, c.C)

23 2 47
100 3 301 


CategoryHomework

LecturesCMC/PythonIntro2025/Homework_AnnoCalc (последним исправлял пользователь FrBrGeorge 2025-12-15 18:09:14)