Это возможно , но ваш пробег может варьироваться в зависимости от ваших вариантов использования:
Один из подходов, показанный ниже, заключается в реализации Var class
, который обрабатывает это для вас;инкапсуляция значений внутри объекта обходит ', передаваемый по значению ', и открывает ' значения ' для изменчивости.вот неполный (и хрупкий) пример;Есть довольно много угловых случаев, чтобы сгладить его, чтобы он работал гладко, но чтобы ответить на ваш вопрос: да, это определенно возможно:
Другие подходы могут использовать inspect module
, или metaclasses
, илиреализация callbacks
.
tkinter
в стандартной библиотеке Python использует специализированные классы и метод обратного вызова.
class Var:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
def __repr__(self):
return str(self._value)
class IntVar(Var):
def __iadd__(self, other: int):
self._value = self._value + other
return self.value
class c_1:
def __init__(self):
self._a = IntVar(5)
@property
def a(self):
return self._a
@a.setter
def a(self, value):
self._a.value = value
class c_2:
def __init__(self, other_obj):
self.other = other_obj
self.b = self.other.a
obj_1 = c_1()
obj_2 = c_2(obj_1)
print(obj_2.b)
obj_1.a = 8
print(obj_2.b)
obj_1.a += 2
print(obj_2.b)
Вывод:
5
8
10