class MyDesc( object ) :
def __init__ ( self ) :
self .val = None
def __get__ ( self , instance, owner) :
print "MyDesc.__get__"
return self .val
def __set__ ( self , instance, value) :
print "MyDesc.__set__"
self .val = value
class A( object ) :
foo1 = MyDesc( )
class MyObj( A) :
foo = MyDesc( )
def __init__ ( self , bar) :
object .__setattr__ ( self , 'names' , dict (
bar= bar,
) )
object .__setattr__ ( self , 'new_names' , dict ( ) )
# def __setattr__(self, name, value):
# print "MyObj.__setattr__ for %s" % name
# for cls in self.__class__.__mro__ + (self, ):
# if name in cls.__dict__:
# return object.__setattr__(self, name, value)
# print 'New name', name, value
# self.new_names[name] = value
def __setattr__ ( self , name, value) :
print "MyObj.__setattr__ for %s" % name
try :
object .__getattribute__ ( self , name)
except AttributeError :
print 'New name' , name, value
self .new_names [ name] = value
else :
object .__setattr__ ( self , name, value)
def __getattr__ ( self , name) :
print "MyObj.__getattr__ for %s" % name
if name in self .new_names :
return self .new_names [ name]
if name in self .names :
return self .names [ name]
raise AttributeError ( name)
if __name__ == "__main__" :
o = MyObj( 'bar-init' )
print o.bar
o.bar = 'baz'
print o.bar
o.bar = 'baz2'
print o.bar
o.bazbar = 'barbaz'
print o.bazbar
o.foo = 'quux'
print o.foo
o.foo1 = 'quux1'
print o.foo1
o.bar = 'baz'
print o.bar
Y2xhc3MgTXlEZXNjKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gTm9uZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcik6CiAgICAgICAgcHJpbnQgIk15RGVzYy5fX2dldF9fIgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKICAgIGRlZiBfX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSk6CiAgICAgICAgcHJpbnQgIk15RGVzYy5fX3NldF9fIgogICAgICAgIHNlbGYudmFsID0gdmFsdWUKCmNsYXNzIEEob2JqZWN0KToKICAgIGZvbzEgPSBNeURlc2MoKQoKY2xhc3MgTXlPYmooQSk6CgogICAgZm9vID0gTXlEZXNjKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFyKToKICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ25hbWVzJywgZGljdCgKICAgICAgICAgICAgYmFyPWJhciwKICAgICAgICApKQogICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCAnbmV3X25hbWVzJywgZGljdCgpKQoKIyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgojICAgICAgICBwcmludCAiTXlPYmouX19zZXRhdHRyX18gZm9yICVzIiAlIG5hbWUKIyAgICAgICAgZm9yIGNscyBpbiBzZWxmLl9fY2xhc3NfXy5fX21yb19fICsgKHNlbGYsICk6CiMgICAgICAgICAgICBpZiBuYW1lIGluIGNscy5fX2RpY3RfXzoKIyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQojICAgICAgICBwcmludCAnTmV3IG5hbWUnLCBuYW1lLCB2YWx1ZQojICAgICAgICBzZWxmLm5ld19uYW1lc1tuYW1lXSA9IHZhbHVlCgogICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICBwcmludCAiTXlPYmouX19zZXRhdHRyX18gZm9yICVzIiAlIG5hbWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwcmludCAnTmV3IG5hbWUnLCBuYW1lLCB2YWx1ZQogICAgICAgICAgICBzZWxmLm5ld19uYW1lc1tuYW1lXSA9IHZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICBwcmludCAiTXlPYmouX19nZXRhdHRyX18gZm9yICVzIiAlIG5hbWUKCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLm5ld19uYW1lczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV3X25hbWVzW25hbWVdCgogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5uYW1lczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZXNbbmFtZV0KCiAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBvID0gTXlPYmooJ2Jhci1pbml0JykKCiAgICBwcmludCBvLmJhcgogICAgby5iYXIgPSAnYmF6JwogICAgcHJpbnQgby5iYXIKICAgIG8uYmFyID0gJ2JhejInCiAgICBwcmludCBvLmJhcgoKICAgIG8uYmF6YmFyID0gJ2JhcmJheicKICAgIHByaW50IG8uYmF6YmFyCgogICAgby5mb28gPSAncXV1eCcKICAgIHByaW50IG8uZm9vCgogICAgby5mb28xID0gJ3F1dXgxJwogICAgcHJpbnQgby5mb28xCgogICAgby5iYXIgPSAnYmF6JwogICAgcHJpbnQgby5iYXI=