简单来说形如__XXX__的变量或函数在Python中有专用的用途
常见的魔法方法大致可分为以下几类:

__init__(构造函数)__new__(真·构造函数)~~__del__~~(析构函数)<aside>
⚠️ 当我们执行 del obj时,这个方法不一定会执行。
由于 Python 是通过引用计数来进行垃圾回收的,如果这个实例在执行 del时,还被其他对象引用,那么就不会触发执行 __del__方法。
所以一般这个函数很少会使用到
</aside>
__str__ / __repr__
~~__unicode__~~
__hash__ / __eq__
__hash__方法返回一个整数,用来表示实例对象的唯一标识,配合 __eq__方法,可以判断两个对象是否相等:
def __hash__(self):
return self.uid
def __eq__(self, other):
return self.uid == other.uid
__bool__
__setattr__:通过「.」设置属性或 setattr(key, value) 设置属性时调用
def __setattr__(self, key, value):
"""属性赋值"""
if key not in ('name', 'age'):
return
if key == 'age' and value < 0:
raise ValueError()
super(Person, self).__setattr__(key, value)
__getattr__:访问不存在的属性时调用
当调用不存在的属性时,python就会调用
__getattr__()尝试获得属性
def __getattr__(self,attr):
if attr == "score":
return 95
print(student.score)
__delattr__:删除某个属性时调用
__getattribute__:访问任意属性或方法时调用