Python 2.6: How to access a base class descriptor hidden by a derived class?

I have a handle that stores data in a host object dictionary. And I have the fields of this descriptor in the class hierarchy with the same name:

class ADescriptor(object):
    def __init__(self, keyname='descr'):
        self.keyname = keyname

    def __get__(self, obj, objtype):
        return 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')

b = B()
b.f = 'b'
print super(B,b).f
super(B,b).f = 'a'

The last line does not work: super (B, b) .f = 'a'

Why get a job and there is no similar set? Can I install A f in a more elegant way than A. dict ['f']. install (b, 'a')?


Fixed:

, , A.f keyname-named A () 8192 - . A. dict ['f'] - get. , Af ADescriptor:

def __get__(self, obj, objtype=None):
    if not obj:      #return descriptor itself if no bound object given
        return self
    return getattr(obj, self.keyname, 8192 )

A.f.__set__(b,'a'). ! @BiggAl - .

+3
1

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__ , , )

?

+1

All Articles