2

假设有人不知道__del__和之间有什么区别__delete__?写一个解释。

4

2 回答 2

0

object.__del__(self)

当实例即将被销毁时调用。这也称为终结器或(不正确的)析构函数。如果基类有__del__()方法,则派生类的__del__()方法(如果有)必须显式调用它,以确保正确删除实例的基类部分。

我认为这意味着在引用计数降至零my_object.__del__后,CPython 的垃圾收集器将调用它。my_object

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_attrdelattr(my_object, 'an_attr')
  • object.__delitem__(self, key)是“调用来实现删除self[key]。” 因此,使用该方法定义用户类可以在调用MyClass.__delitem__语句时实现自定义行为。del my_object[a_key]
于 2021-04-25T06:57:43.503 回答
-3

__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_varor的行为getattr(obj, “my_var”)

class Klaus: def getattribute (self, attrname): try: attribute = attrname from instance Klaus except 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)
于 2019-12-28T04:55:10.103 回答