[英]What is the difference between `__del__` and `__delete__`?
假如有人不知道有什么不同之间__del__
和__delete__
? 写一个解释。
object.__del__(self)
:在实例即将被销毁时调用。 这也称为终结器或(不正确地)析构函数。 如果基类具有
__del__()
方法,则派生类的__del__()
方法(如果有)必须显式调用它以确保正确删除实例的基类部分。
我认为这意味着my_object.__del__
将在my_object
的引用计数降至零后被 CPython 的垃圾收集器调用。
object.__delete__(self, instance)
:调用以删除所有者类的实例
instance
上的属性。
__delete__
dunder 方法与 python 的描述符概念有关; 描述符是“定义__get__()
、 __set__()
或__delete__()
方法的任何对象。” 描述符可用于实现属性查找/分配/删除的自定义行为(分别通过__get__
/ __set__
/ __delete__
)。
del
语句:“删除名称会从本地或全局命名空间中删除该名称的绑定……属性引用、订阅和切片的删除将传递给所涉及的主要对象……”delattr
内置函数。 从文档中,“该函数删除命名属性,前提是对象允许它。例如, delattr(x, 'foobar')
等效于del x.foobar
。”object.__delattr__(self, name)
在尝试删除属性时被调用。 根据文档,“只有当del obj.name
对对象有意义时,才应该实现这一点。” 因此,使用MyClass.__delattr__
方法定义用户类可以在调用语句del my_object.an_attr
或(等效地)调用delattr(my_object, 'an_attr')
时启用自定义行为。object.__delitem__(self, key)
是“调用以实现self[key]
删除。” 因此,使用MyClass.__delitem__
方法定义用户类可启用自定义行为,例如调用语句del my_object[a_key]
。 __del__
,当你删除一个对象被调用, __delete__
当你删除一个对象的属性有时也被称为。
del x.my_num # __delete__
del x # __del__
__del__:
以下代码显示__del__
何时被调用:
class MyClass:
def __init__(self):
file = open("really_cool_file.txt", "w+")
self._f = file
def __del__(self):
print("closing any open files ")
self._f.close()
my_instance = MyClass()
del my_instance
如果my_instance
是指向数据的最后一个标签,则del my_instance
调用MyClass.__del__(my_instance)
从技术上讲, del my_instance
只会删除标签my_instance
。 想象一下参加聚会的人都戴着名牌。 有时一个人同时有 6 或 7 个姓名标签,而其他时候,他们只有一个。 Python 会将任何没有佩戴至少一个名牌的人踢出派对。 MyClass.__del__(my_instance)
在从一段数据中删除姓氏标签/标签时被调用。
上面的代码显示了我们何时确保关闭打开的文件的示例。 另一个例子可能是计算给定类的活动实例数:
class Klass:
count = 0
# `count` belongs to the class
# instances do not each get their own copy of `count`
def __init__(self):
type(self).count += 1
self.instance_var = "I belong to instances"
def __del__(self):
type(self).count -= 1
obj = Klass()
print(obj.count)
__delete__
不像__del__
, __delete__
与描述的事情。 下面的代码描述了obj.my_var
或getattr(obj, “my_var”)
class Klaus: def getattribute (self, attrname): try: attribute = attrname from instance Klaus 除了 AttributeError: attribute = attrname from class Klaus
# Begin code for handling "descriptors"
if hasattr(attribute, '__get__'):
attr = attribute.__get__(self, Klaus)
# End code for handling "descriptors"
return attribute
如果my_var
是一个描述符,那么下面两行代码等效:
x = obj.my_var
x = Klass.my_var.__get__(obj, "my_var")
就像__getattribute__
检查属性是否有__get__
方法一样, __delattr__
将检查属性是否有__delete__
方法。
def __delattr__(self, name):
attribute = getattr(self, name)
if hasattr(attribute, "__delete__"):
attribute.__delete__(self)
else:
del self.__dict__[name]
通过查看以下代码,您可以看到__delete__
被调用:
class desc:
def __delete__(descriptor, instance_of_Klaus):
print("attribute was deleted")
class Klaus:
d = desc()
def __init__(self):
pass
my_instance = Klaus()
del my_instance.d
在处理描述符时,以下几行代码都是等价的:
del my_instance.d
delattr(my_instance, "d")
Klaus.d.__delete__(my_instance)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.