1.什么是魔术方法
- 在Python中以两个下划线开头和结尾的方法被称为魔术方法,魔术方法都是一些内置方法;
2.基本魔术方法
-
__new__
:是在一个对象实例化的时候所调用的第一个方法,用来创建类并返回这个类的实例; -
__init__
:构造器,是一个初始化方法,在一个实例被创建之后调用; -
__del__
:析构器,当一个实例被销毁的时候调用的方法; -
__bool__
:如果对象实现了__bool__方法,那么返回结果,非0为真,如果没有实现__bool__方法,调用__len__方法,返回非0为真; -
__hash__
:返回一个整数,表明对象可以hash; -
__repr__
:返回对象的字符串表达式,如果没有实现,直接返回对象内存地址字符串; -
__str__
:str()、print()、format()函数打印对象字符串,会直接调用__str__方法,如果没有实现,会调用__repr__方法; -
__hash__
:定义当被 hash() 调用时的行为; -
__bytes__
:定义当被 bytes() 调用时的行为; -
__format__
:定义当被 format() 调用时的行为;
3.有关属性魔术方法
-
__getattr__
:定义当用户试图获取一个不存在的属性时的行为; -
__setattr__
:定义当一个属性被设置时的行为; -
__getattribute__
:定义当该类的属性被访问时的行为; -
__delattr__
:删除一个属性时执行的方法; -
__dir__
:定义当 dir() 被调用时的行为; -
__get__
:定义当描述符的值被取得时的行为; -
__set__
:定义当描述符的值被改变时的行为; -
__delete__
:定义当描述符的值被删除时的行为;
4.运算符相关魔术方法
class Student:
def __init__(self, x):
self.x = x
def __add__(self, other):
return self.x + other.x
def __sub__(self, other):
return self.x - other.x
a = Student(100)
b = Student(200)
print(b-a)
print(b+a)
-
__add__
:定义加法的方法; -
__sub__
:定义减法的方法; -
__mul__
:定义乘法的方法; -
__truediv__
:定义除法的方法; -
__floordiv__
:定义整数除法的行为://; -
__mod__
:定义取模算法的行为:%; -
__divmod__
:定义当被 divmod() 调用时的行为; -
__pow__
:定义当被 power() 调用或 ** 运算时的行为; -
__lshift__
:定义按位左移位的行为:<<; -
__rshift__
:定义按位右移位的行为:>>; -
__and__
:定义按位与操作的行为:&; -
__xor__
:定义按位异或操作的行为:^; -
__or__
:定义按位或操作的行为:|;
5.比较操作符相关魔术方法
-
__eq__
:定义等于号的方法,等价于==; -
__lt__
:定义小于号方法,等价于<; -
__gt__
:定义大于号方法,等价于>; -
__le__
:定义小于等于号的行为,等价于 <= ; -
__ne__
:定义不等号的行为,等价于!= ; -
__ge__
:定义大于等于号的行为,等价于 >= ;
6.容器相关的魔术方法
class Student:
def __init__(self):
self.items = {}
def __len__(self):
return len(self.items)
# 如果stu.items不为空,返回True
def __bool__(self):
return True if len(self) else False
def __iter__(self):
return iter(self.items)
def __getitem__(self, item):
return self.items[item]
def __setitem__(self, key, value):
self.items[key] = value
stu= Student()
stu.items['Course'] = 'Python'
stu.items['Teacher'] = '张三'
print(len(stu))
print(bool(stu))
print(iter(stu))
print(stu['Course'])
stu['Course'] = 'HTML'
print(stu['Course'])
-
__len__
:定义当被 len() 调用时的行为(返回容器中元素的个数); -
__iter__
:定义当迭代容器中的元素的行为; -
__getitem__
:获取容器中的元素,相当于 self[key]; -
__setitem__
:设置容器中的元素,相当于 self[key] = value; -
__delitem__
:删除容器中的某个元素,相当于 del self[key]; -
__reversed__
:定义当被 reversed() 调用时的行为; -
__contains__
:定义当使用成员测试运算符(in 或 not in)时的行为;
7.可调用对象
# 函数是可调用对象
def add():
pass
add.__call__()
add()
# 类实现了__call__方法
class Add():
def __call__(self, *args, **kwargs):
print(args)
print(kwargs)
add_instance = Add()
add_instance.__call__(1,2,3, course='Python')
add_instance(1,2,3,course='Python')
-
Python中,实现了__call__方法的对象都是可调用对象;
-
__call__
:允许一个类的实例像函数一样被调用:x(a, b)
调用为x.__
call
__(a, b)
;