2016-03-10 4 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): 
    ... 

Но есть способ повторно использовать оператор питона, чтобы сделать это?

+0

Почему это downvoted? – viksit

ответ

1

Просто определить __delattr__ метод:

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

Спасибо. Я пробовал это раньше, и по какой-то причине он не работал. Я думаю, причина в том, что я делал «if key in self._meta», который каким-то образом испортил это, я еще не смог понять. – viksit