为覆盖了 __getattribute__ 的类实现 __del__ 方法
Posted
技术标签:
【中文标题】为覆盖了 __getattribute__ 的类实现 __del__ 方法【英文标题】:Implement _del_ method for a class with __getattribute__ overriden 【发布时间】: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 运算符来做到这一点?
【问题讨论】:
为什么这被否决了? 【参考方案1】:只需定义__delattr__
方法:
def __delattr__(self, key):
del self._meta[key]
【讨论】:
谢谢。我以前试过这个,由于某种原因它不起作用。我认为原因是我正在做一个“if key in self._meta”,它以某种我还无法弄清楚的方式搞砸了。以上是关于为覆盖了 __getattribute__ 的类实现 __del__ 方法的主要内容,如果未能解决你的问题,请参考以下文章
python笔记59-类里面的__getattribute__属性拦截器
python getattribute、get、getattr、getitem等用法
Python中常用内建属性:__getattribute__属性拦截器使用详解