python杂记——魔法方法

什么是魔法函数python中有哪些魔法函数
摘要由CSDN通过智能技术生成

什么是魔法方法?

魔法方法(magic methods):python中的魔法方法是指方法名以两个下划线开头并以两个下划线结尾的方法,因此也叫Dunder Methods (Double Underscores)。常用于运算符重载。魔法方法会在对类的某个操作时后端自动调用,而不需要自己直接调用。例如当使用+将两个数字相加时,在类内部会调用__add__()方法,再比如创建一个类A的对象,a=A(),python就会自动调用__new__和__init__。

常见魔法方法

初始化和构造

方法名 描述
_new_(cls, other) 在实例化一个对象的时候被调用
_init_(self, other) 用于初始化对象,被__new__方法调用
_del_(self) 对象的析构方法

有几个问题需要注意一下:

  1. 只有继承object的新式类才有_new_
  2. __new__至少有一个参数cls,代表当前类
  3. __new__必须要有返回值,返回创建的对象
  4. __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: "
  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值