Конечно, A.f.__set__(b,'a')
будет работать, если A.__dict__['f'].__set__(b,'a')
работает?И тогда даже A.f.b = 'a'
должно работать, хотя вам, возможно, придется указать его как свойство, если мне не изменяет память.
Посмотрите историю, чтобы увидеть грандиозный мозговой перманент ...
>>> class ADescriptor(object):
def __init__(self, keyname='descr'):
self.keyname = keyname
def __get__(self, obj, objtype):
return (self.keyname, getattr(obj, self.keyname, 8192 ))
def __set__(self, obj, val):
setattr(obj, self.keyname, val)
>>> class A(object):
f = ADescriptor('keyA')
>>> class B(A):
f = ADescriptor('keyB')
>>> a, b = A(), B()
>>> print (a.f, b.f, A.f, B.f)
(('keyA', 8192), ('keyB', 8192), ('keyA', 8192), ('keyB', 8192))
>>> b.f = 'b'
>>> print (a.f, b.f, A.f, B.f)
(('keyA', 8192), ('keyB', 'b'), ('keyA', 8192), ('keyB', 8192))
>>> A.f = 'a'
>>> print (a.f, b.f, A.f, B.f)
('a', ('keyB', 'b'), 'a', ('keyB', 8192))
>>>
Это то, что вы правильно поняли?(Я изменил __get__
для отладки, его нужно вернуть обратно к тому, как у вас это было)
Что вы пытались сделать с супер?