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 MyObj(object):
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
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')
o.quux = 3
print 'dict', o.__dict__
print 'new_names', o.new_names
print 'o.quux', o.quux
print "o.new_names['quux']", o.new_names['quux']
Y2xhc3MgTXlEZXNjKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gTm9uZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcik6CiAgICAgICAgcHJpbnQgIk15RGVzYy5fX2dldF9fIgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKICAgIGRlZiBfX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSk6CiAgICAgICAgcHJpbnQgIk15RGVzYy5fX3NldF9fIgogICAgICAgIHNlbGYudmFsID0gdmFsdWUKCmNsYXNzIE15T2JqKG9iamVjdCk6CgogICAgZm9vID0gTXlEZXNjKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFyKToKICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ25hbWVzJywgZGljdCgKICAgICAgICAgICAgYmFyPWJhciwKICAgICAgICApKQogICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCAnbmV3X25hbWVzJywgZGljdCgpKQoKICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgcHJpbnQgIk15T2JqLl9fc2V0YXR0cl9fIGZvciAlcyIgJSBuYW1lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcHJpbnQgJ05ldyBuYW1lJywgbmFtZSwgdmFsdWUKICAgICAgICAgICAgc2VsZi5uZXdfbmFtZXNbbmFtZV0gPSB2YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcHJpbnQgIk15T2JqLl9fZ2V0YXR0cl9fIGZvciAlcyIgJSBuYW1lCgogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5uZXdfbmFtZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ld19uYW1lc1tuYW1lXQoKICAgICAgICBpZiBuYW1lIGluIHNlbGYubmFtZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWVzW25hbWVdCgogICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbyA9IE15T2JqKCdiYXItaW5pdCcpCiAgICBvLnF1dXggPSAzCiAgICBwcmludCAnZGljdCcsIG8uX19kaWN0X18KICAgIHByaW50ICduZXdfbmFtZXMnLCBvLm5ld19uYW1lcwogICAgcHJpbnQgJ28ucXV1eCcsIG8ucXV1eAogICAgcHJpbnQgIm8ubmV3X25hbWVzWydxdXV4J10iLCBvLm5ld19uYW1lc1sncXV1eCdd