2016-03-10 55 views
-1

this question爲指針類,假設存在類似下面的類:實現_del_方法與__getattribute__重寫

class Container(object): 
    def __init__(self, **kwargs): 
     self._meta = defaultdict(lambda: None) 
     for attr, value in kwargs.iteritems(): 
      self._meta[attr] = value 

    def __getattr__(self, key): 
     try: 
      return self._meta[key] 
     except KeyError: 
      raise AttributeError(key) 

    def __setattr__(self, key, value): 
     if key in ('_meta', '_hasattr'): 
      super(Container, self).__setattr__(key, value) 
     else: 
      self._meta[key] = value 

這允許以下行爲:

c = Container() 
c.a = 1 
print(c.a) # 1 
print(c.b) # None 

問題:實施運營商的最佳方式是什麼?以下工作原理:

# Should delete the value of a from Container._meta 
del c.a 

當然,人們可以明顯地實施的方法一樣,

def _delete(self, key): 
    ... 

但是,有沒有辦法再使用python的運營商做到這一點?

+0

爲什麼這個downvoted? – viksit

回答

1

只要定義__delattr__方法:

def __delattr__(self, key): 
    del self._meta[key] 
+0

謝謝。我之前嘗試過這種方式,出於某種原因,這種方式無法正常工作。我認爲原因是我正在做一個「如果self._meta的關鍵」,它以某種方式搞砸了我還沒有弄清楚。 – viksit