2012-12-06 55 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