参考:Python:实例讲解Python中的魔法函数(高级语法) - 知乎
目录
7.__getattribute__、__getattr__、__setattr__、__delattr__、.
9.__setitem__、__getitem__、__delitem__、[ ]
1.__name__
运行当前文件时,__name__的值为'__main__'
- 示例
- 运行结果
2.__class__
实例调用__class__时会指向其对应的类,然后可以再调用类的属性
- 示例
- 运行结果
可以看到,A是通过type来定义,type有三个参数:类名、继承、私有化
- 示例
- 运行结果
3.__call__、( )
让实例可以像函数一样被调用,即a()相当于a.__call__()
- 示例
- 运行结果
4.__str__、__repr__
用于输出实例的基本信息
5.__contains__
对于自定义类,在使用in语句时,将调用__contains__方法
- 示例
- 运行结果
6.__iter__、__next__
(1)for ... in 本质上先调用了可迭代对象的__iter__方法得到一个迭代器,然后不断调用迭代器的__next__方法获取下一个值,直到遇到StopIteration的异常后结束循环。
- 判断是否是可迭代对象(注意必须是类的实例,因为__iter__方法的返回值self指向实例本身)
from collections.abc import Iterable
print(isinstance(list, Iterable))
print(isinstance(list(), Iterable))
(2)python要求迭代器也是可迭代的,还要为迭代器实现__iter__方法。__iter__方法返回一个迭代器,由于实现了__iter__方法的对象即为可迭代对象,因此返回对象本身即可。
def __iter__(self):
return self
7.__getattribute__、__getattr__、__setattr__、__delattr__、.
使用xxx.xxx时会调用__xxxattr__方法
python __getattribute__、__getattr__、__setattr___hllyzms的博客-CSDN博客___setattr__
注意重写__getattribute__时容易陷入无限循环,__setattr__同理
def __getattribute__(self, attr):
print('nothing')
return self.name
# object.__getattribute__(self, attr)
# super().__getattribute__(attr)
self.name实际调用了self.__getattribute__('name'),应调用基类的__getattribute__来实现
8. __dict__、dir()
9.__setitem__、__getitem__、__delitem__、[ ]
使用方括号时会调用__xxxitem__方法
__setitem__:当属性被赋值时调用该方法
__getitem__:当访问不存在的属性时调用该方法
__delitem__:当删除属性时调用该方法