python @property setter delegation

Viewed 368

I have an object with a bunch @property getters and setters on it. I want to delegate to that object, including delegating the getting and setting. I also want to be able to override some setters in the delegating class. Delegation as described here works for getters but not for setters. Is there a simple way to do this short of verbosely duplicating all of the @property setters?

For example, in the following the underlying @a.setter is never hit:

class A:
  _a = 'A.a'
  _b = 'A.b'

  @property
  def a(self):
    print('A.a.getter')
    return self._a

  @a.setter
  def a(self, a):
    print('A.a.setter')
    self._a = a

  @property
  def b(self):
    print('A.b.getter')
    return self._b

  @b.setter
  def b(self, b):
    print('A.b.setter')
    self._b = b

class B(object):
  _A = None

  def __init__(self, A):
    self._A = A

  @property
  def b(self):
    print('B.b.getter')
    return self._A.b

  @b.setter
  def b(self, b):
    print('B.b.setter')
    self._A.b = b

  def __getattr__(self, name):
    return getattr(self._A, name)

b = B(A())
print(b.a)
b.a = 123
b.b = 456
1 Answers
Related