什么是魔法方法?
魔法方法(magic methods):python中的魔法方法是指方法名以两个下划线开头并以两个下划线结尾的方法,因此也叫Dunder Methods (Double Underscores)。常用于运算符重载。魔法方法会在对类的某个操作时后端自动调用,而不需要自己直接调用。例如当使用+将两个数字相加时,在类内部会调用__add__()方法,再比如创建一个类A的对象,a=A(),python就会自动调用__new__和__init__。
常见魔法方法
初始化和构造
方法名 | 描述 |
---|---|
_new_(cls, other) | 在实例化一个对象的时候被调用 |
_init_(self, other) | 用于初始化对象,被__new__方法调用 |
_del_(self) | 对象的析构方法 |
有几个问题需要注意一下:
- 只有继承object的新式类才有_new_
- __new__至少有一个参数cls,代表当前类
- __new__必须要有返回值,返回创建的对象
- __init__必须有一个参数self,这个是__new__的返回值, __init__不需要返回值
测试代码:
class MyClass(object):
def __init__(self, num):
self.num = num
print("i am __init__ function")
def __new__(cls, num):
print("i am __new__ function")
obj = super(MyClass, cls).__new__(cls)
return obj
def __del__(self):
print("i am __del__ function")
myclass = MyClass(num=55)
print("create obj ok === ")
del myclass
输出结果:
i am __new__ function
i am __init__ function
create obj ok ===
i am __del__ function
一元操作符
方法名 | 描述 |
---|---|
_pos_(self) | 会被取正操作符调用,例如 +a |
_neg_(self) | 会被取反操作符调用,例如 -a |
_abs_(self) | 在调用内置函数abs()的时候被调用, 取绝对值 |
_invert_(self) | 在使用~操作符的时候被调用, 按位取反 |
_round_(self, n) | 执行内置函数round()的时候被调用, 四舍五入取近似值,n为小数位数 |
_floor_(self) | 执行内置函数math.floor()的时候被调用, 取小于等于该值的最大整数 |
_ceil_(self) | 执行内置函数math.ceil()时被调用,取大于等于该值的最小整数 |
_trunc_(self) | 执行math.trunc()函数时被调用, 取该值的截断整数 |
测试代码:
class TestUnaryOpsAndFunc:
def __init__(self, num=0) -> None:
self._num = 3
self._neg_num = -5
self._float_num = 3.1415
self._neg_float_num = -3.1415
def __pos__(self):
return +self._neg_num
def __neg__(self):
return -self._num
def __abs__(self):
return abs(self._neg_float_num)
def __invert__(self):
return ~self._num
def __round__(self):
return round(self._float_num)
def __floor__(self):
return math.floor(self._neg_float_num)
def __ceil__(self):
return math.ceil(self._float_num)
def __trunc__(self):
return math.trunc(self._float_num)
test_class = TestUnaryOpsAndFunc()
print("pos: ", +test_class)
print("neg: "