__del__ 和 __delete__ 的区别
时间: 2023-07-03 21:27:59 浏览: 247
在 Python 中,`__del__` 和 `__delete__` 都是特殊方法(dunder method),但是它们的作用和用法是不同的。
`__del__` 是一个特殊方法,它定义了当对象被垃圾回收时要执行的操作。它可以用来清理对象占用的资源,如关闭文件、释放内存等。`__del__` 方法没有参数,也没有返回值。它的定义方式如下:
```python
def __del__(self):
# do something
```
`__delete__` 是一个用于描述符(descriptor)类的特殊方法,它定义了当描述符被删除时要执行的操作。描述符是一种 Python 对象,它定义了在访问类的属性时要执行的操作,如属性的读取、赋值等。`__delete__` 方法接受一个参数,即描述符所绑定的对象,用于执行与删除操作相关的操作。它的定义方式如下:
```python
def __delete__(self, instance):
# do something
```
因此,`__del__` 和 `__delete__` 的作用和用法是不同的,不能混淆。
相关问题
def delete(self, del_node): # 删除故障节点 def _delete_next(node): if del_node in node.next: node.next.remove(del_node) return for _node in node.next: _delete_next(_node) if del_node in self.heads: self.heads.remove(del_node) return for _node in self.heads: _delete_next(_node)
这是 Server 类中的一个方法 delete,用于删除链表中的故障节点。具体来说,方法的参数 del_node 是要删除的节点。
方法的实现采用了递归的方式。首先,方法会定义一个内部函数 _delete_next,用于删除当前节点的下一个节点中的 del_node。如果下一个节点中包含了 del_node,那么就将其从当前节点的 next 列表中删除。如果下一个节点中不包含 del_node,那么就递归调用 _delete_next 函数,继续删除下一个节点的后继节点。
然后,方法会判断 del_node 是否为头节点。如果是头节点,那么就将其从头节点列表中删除即可。
最后,对于每个头节点,都调用 _delete_next 函数,删除其后继节点中的 del_node。这样,整个链表中的所有 del_node 都会被删除。
优化使得每检索50张照片,输出一次已检索文件数:import os from PIL import Image from multiprocessing import Pool def is_black_image(file_path): with Image.open(file_path) as img: pixels = list(img.getdata()) if all(sum(pixel) == 0 for pixel in pixels): return True else: return False def delete_black_images(file_path): if is_black_image(file_path): os.remove(file_path) print('{} has del'.format(file_path)) def batch_delete_black_images(folder_path): file_list = [] for f in os.listdir(folder_path): file_path = os.path.join(folder_path, f) if os.path.isfile(file_path): file_list.append(file_path) with Pool() as p: p.map(delete_black_images, file_list) if __name__ == '__main__': batch_delete_black_images(r'F:\H18\Dfinal640.tif\8-2')
为了每检索50张照片输出一次已检索文件数,您可以在 `batch_delete_black_images` 函数中添加一个计数器来实现。具体地,您可以在函数中添加一个变量 `count`,每删除一张黑色图片时,将计数器加1,并且当计数器能够被50整除时,打印当前已经检索的文件数。下面是修改后的代码:
```
import os
from PIL import Image
from multiprocessing import Pool
def is_black_image(file_path):
with Image.open(file_path) as img:
pixels = list(img.getdata())
if all(sum(pixel) == 0 for pixel in pixels):
return True
else:
return False
def delete_black_images(file_path):
if is_black_image(file_path):
os.remove(file_path)
print('{} has del'.format(file_path))
return True
return False
def batch_delete_black_images(folder_path):
file_list = []
count = 0
for f in os.listdir(folder_path):
file_path = os.path.join(folder_path, f)
if os.path.isfile(file_path):
file_list.append(file_path)
with Pool() as p:
results = p.map(delete_black_images, file_list)
for result in results:
if result:
count += 1
if count % 50 == 0:
print('已检索 {} 个文件'.format(count))
if __name__ == '__main__':
batch_delete_black_images(r'F:\H18\Dfinal640.tif\8-2')
```
注意,为了避免多个进程同时打印计数器的值,我们在每50次删除操作后只打印计数器的值,而不是实时打印。
阅读全文