使用__getattribute__覆盖为类实现_del_方法

时间:2016-03-10 22:38:31

标签: python class attributes metaclass

this question作为指针,让我们说有一个如下的类:

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运算符来做到这一点?

1 个答案:

答案 0 :(得分:1)

只需定义__delattr__方法:

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