如果你真的想這樣做,這個鏈接提供了一個非常酷的方法來實現。唯一需要注意的是你必須使用eval/exec/execfile來執行你的代碼。
https://mail.python.org/pipermail/python-ideas/2011-March/009657.html
class MyDict:
def __init__(self, mapping):
self.mapping = mapping
def __getitem__(self, key):
value = self.mapping[key]
if hasattr(value, '__get__'):
print('Invoking descriptor on', key)
return value.__get__(key)
print('Getting', key)
return value
def __setitem__(self, key, value):
self.mapping[key] = value
class Property:
def __init__(self, getter):
self.getter = getter
def __get__(self, key):
return self.getter(key)
if __name__ == '__main__':
md = MyDict({})
md['x'] = 10
md['_y'] = 20
md['y'] = Property(lambda key: md['_'+key])
print(eval('x+y+1', {}, md))
雖然有點麻煩,我認爲這是非常酷。
這是可能的(但我真的不推薦它)子類'模塊',添加所需的描述符,實例化子類,並替換當前模塊的'sys.modules'條目與新實例,所有在模塊自己的文件。 – kwatford 2010-08-23 16:45:22