2012-02-02 73 views
1

我正在尋找一個Python類裝飾器將轉換任何元素獲得屬性的訪問,這樣的事情:Python類裝飾轉換元件訪問屬性訪問

@DictAccess 
class foo(bar): 
    x = 1 
    y = 2 

myfoo = foo() 
print myfoo.x # gives 1 
print myfoo['y'] # gives 2 
myfoo['z'] = 3 
print myfoo.z # gives 3 

等是否存在裝飾已地方?如果不是,那麼實施它的正確方法是什麼?我是否應該將__new__包裝在類foo上並將__getitem____setitem__屬性添加到實例中?那麼如何讓這些新課程正確地綁定到新課堂呢?我明白DictMixin可以幫助我支持所有的dict功能,但我仍然必須以某種方式獲得類中的基本方法。

回答

4

的裝飾需要增加__getitem__方法和__setitem__方法:

def DictAccess(kls): 
    kls.__getitem__ = lambda self, attr: getattr(self, attr) 
    kls.__setitem__ = lambda self, attr, value: setattr(self, attr, value) 
    return kls 

這將正常工作與你的示例代碼:

class bar: 
    pass 

@DictAccess 
class foo(bar): 
    x = 1 
    y = 2 

myfoo = foo() 
print myfoo.x # gives 1 
print myfoo['y'] # gives 2 
myfoo['z'] = 3 
print myfoo.z # gives 3 

該測試代碼產生預期值:

1 
2 
3 
+0

和'__delitem __()'。另外,你可能想要防止踩踏,比如'__dict__'。 – 2012-02-02 02:35:14

+0

@ IgnacioVazquez-Abrams我同意,有許多方法可以擴展基本配方(可能包括由* MutableMapping *提供的完整字典API,也許試圖保護對象的命名空間的某些部分)。就目前而言,上面的代碼很簡單,足以讓OP開始這個冒險:-) – 2012-02-02 02:41:39

+1

謝謝,這看起來不錯。跺腳__dict__'不是問題 - 我知道哪些屬性將被訪問。但是獲得DictMixin功能的可能性會很有趣。任何想法如何做到這一點? – StasM 2012-02-02 05:59:04