【问题标题】:Implement _del_ method for a class with __getattribute__ overriden为覆盖了 __getattribute__ 的类实现 __del__ 方法
【发布时间】:2016-06-26 00:31:49
【问题描述】:

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

【问题讨论】:

  • 为什么这被否决了?

标签: python class attributes metaclass


【解决方案1】:

只需定义__delattr__ 方法:

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

【讨论】:

  • 谢谢。我以前试过这个,由于某种原因它不起作用。我认为原因是我正在做一个“if key in self._meta”,它以某种我还无法弄清楚的方式搞砸了。
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2014-11-20
相关资源
最近更新 更多