假设我有一个客户deleter
属性和实例本身的类:
class Hello:
def __init__(self):
self._is_open = None
@property
def is_open(self):
return self._is_open
@is_open.deleter
def is_open(self):
print("Using custom deleter!")
del self._is_open
def __delattr__(self, attr):
print ('Deleting attr %s' % attr)
super().__delattr__(attr)
并称之为:
>>> hello = Hello()
>>> del hello.is_open
Deleting attr is_open
Using custom deleter!
Deleting attr _is_open
看起来它首先调用is_open
上的__delattr__
,然后调用@is_open.deleter
,然后调用_is_open
上的__delattr__
。为什么删除程序的事件链是这样工作的?你知道吗
Python properties是descriptors。它们通过descriptor protocol实现。你知道吗
datamodel钩子^{} 优先于描述符协议。因此,如果您定义了一个定制的
__delattr__
方法,那么将优先调用属性deleter。你知道吗事实上,它是
__delattr__
的默认实现,如果需要,它将去调用描述符,您可以通过注释掉以super
开头的行来验证这一点(您应该看到属性deleter现在根本不会被调用)。你知道吗有了这个推理,你就可以理解这样的一系列事件:
需要注意的是,
__delattr__
第一次和第二次收到不同的参数:"is_open"
第一次然后"_is_open"
第二次。你知道吗相关问题 更多 >
编程相关推荐