_del_ 类的析构方法,它在对象被回收时执行,主要的作用时用来释放资源(内存 文件 进程等) 因为Python内存回收机制,使得Python的del方法的执行时间是不确定的,因此不推荐在Python中使用析构方法。 class Bar(object): def __del__(self): print("被回收了! ~") a = Bar() a.__del__() # 主动调用是没用的,因为引用计数不为零,并不会回收资源 gc print("已经删除a了") print(a) del a # print(a) _dict_ 是一个绑定对象属性的字典 存储的是属性的 键值对 Python中的魔术方法,也称为特殊方法,是Python语言中一种特殊命名约定的方法,它们以两个下划线开头和结尾,如`__init__`、`__str__`等。这些方法在特定的情境下自动调用,以实现特定的功能。在Python中,魔术方法对于理解和操作对象的行为至关重要。 我们来看`__del__`方法,这是对象的析构方法,当对象被垃圾回收机制回收时调用,用于释放资源,比如内存、打开的文件或者进程。然而,由于Python的垃圾回收机制并不保证`__del__`在何时执行,因此不推荐直接依赖它来释放资源,特别是在需要立即释放资源的情况下。例如,以下代码: ```python class Bar: def __del__(self): print("被回收了! ~") a = Bar() a.__del__() # 主动调用无效,因为a的引用计数不为0 ``` 在这里,`a.__del__()`并不会导致对象的回收,只有当`a`的引用计数变为0,垃圾回收器才会回收`a`,进而调用`__del__`。 `__dict__`是Python对象内部用于存储属性的字典,它保存了对象的所有动态属性的键值对。虽然可以通过直接操作`__dict__`来添加或修改对象的属性,但这样做会降低代码的可读性和维护性,因此并不推荐。例如: ```python a = Bar() a.__dict__['new_attribute'] = 'value' ``` 接着,`__slots__`是用于限制类的实例能拥有的属性,它提高了效率,减少了内存消耗。一旦设置了`__slots__`,类的实例将不再有`__dict__`,而是由`__slots__`指定的属性。例如: ```python class Bar: __slots__ = ('name', 'gender') a = Bar() a.name = 'John' # 正常 a.age = 18 # 报错,age不在__slots__中 ``` `__str__`和`__repr__`方法是表示对象的字符串形式。`__str__`用于`print`函数和`str()`函数,通常应返回用户友好的字符串。`__repr__`则返回解释器友好的字符串,通常用于调试。例如: ```python class Bar: def __str__(self): return "Bar" def __repr__(self): return "Bar representation" a = Bar() print(a) # Bar print(repr(a)) # Bar representation ``` `__class__`属性提供了访问对象所属类的能力,可以用来调用类的方法或访问类的属性。例如: ```python class Bar: name = 'monkey' a = Bar() print(a.__class__.name) # monkey ``` `__doc__`属性用于获取对象的文档字符串,提供关于对象用途的信息。例如: ```python class Bar: """A simple show class!""" name = 'monkey' a = Bar() print(a.__class__.__doc__) # A simple show class! ``` `__base__`和`__bases__`分别用于获取单个类的父类和类的继承列表。例如: ```python class Lady: ... class Small: ... class SmallLady(Small, Lady): ... print(Lady.__base__) # <class 'object'> print(SmallLady.__bases__) # (<class '__main__.Small'>, <class '__main__.Lady'>) ``` 我们讨论迭代相关的魔术方法,`__iter__`、`__next__`和`__len__`。`__iter__`返回一个迭代器对象,`__next__`返回迭代器的下一个值,`__len__`返回对象的长度。例如,创建一个简单的列表迭代器: ```python class ListMeta(type): def __call__(self, data): self.data = list(data) return self def __iter__(self): return self def __next__(self): if not self.data: raise StopIteration return self.data.pop(0) def __len__(self): return len(self.data) lst = ListMeta([1, 2, 3]) for item in lst: print(item) # 输出: 1 2 3 print(len(lst)) # 输出: 0 ``` 以上就是关于Python魔术方法的一些基本介绍,包括`__del__`、`__dict__`、`__slots__`、`__str__`、`__repr__`、`__class__`、`__doc__`、`__base__`、`__bases__`、`__iter__`、`__next__`和`__len__`。了解和掌握这些魔术方法有助于更深入地理解Python的面向对象编程和内部机制。
- 粉丝: 4
- 资源: 974
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot和MyBatis的社区问答系统.zip
- (源码)基于Spring Boot和WebSocket的人事管理系统.zip
- (源码)基于Spring Boot框架的云网页管理系统.zip
- (源码)基于Maude和深度强化学习的智能体验证系统.zip
- (源码)基于C语言的Papageno字符序列处理系统.zip
- (源码)基于Arduino的水质监测与控制系统.zip
- (源码)基于物联网的智能家居门锁系统.zip
- (源码)基于Python和FastAPI的Squint数据检索系统.zip
- (源码)基于Arduino的图片绘制系统.zip
- (源码)基于C++的ARMA53贪吃蛇游戏系统.zip