2012-12-06 54 views
1

我被指示使用更多的pythonish方式setter和getters @property。因此,我們有這樣的事情:python dictmixin對象與屬性修飾器

from UserDict import DictMixin 

class A(dict): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    @property 
    def a(self): 
     return self._a 

    @a.setter 
    def a(self, value): 
     self._a = value 

    def __getitem__(self, key): 
     return getattr(self, key) 

    def __setitem__(self, key, value): 
     setattr(self, key, value) 

    def keys(self): 
     return [k for k in self.__dict__.keys() if not k.startswith('_')] 

    def do_whatever(self): 
     pass 


a = A(1,2) 
print a.keys() 

輸出爲[「B」],起初我沒想到的是,但它實際上是有道理的。

問題是如何獲取所有屬性名稱而不是方法的名稱。有任何想法嗎?

+0

我可以讓法鍵()返回的屬性的名稱硬編碼的名單,但似乎真是太酷了。 – mdob

+0

你使用'DictMixin'的任何原因 - 現在有點老了 - 你想做什麼? (創建一個也支持屬性訪問的'dict')? –

+0

我想要一個可以像字典一樣使用的方法。訪問一個['a'] – mdob

回答

0

屬性被實現爲descriptors,因此屬於的類,而不是實例

>>> class Question(object): 
...  @property 
...  def answer(self): 
...   return 7 * 6 
... 
>>> q = Question() 
>>> q.answer 
42 
>>> q.__dict__ 
{} 
>>> for key, value in Question.__dict__.iteritems(): 
...  if isinstance(value, property): 
...   print key 
... 
answer