Python 入门 17 —— 类的魔法方法、__new__()、 __ call__()

本文详细介绍了Python中的类的魔法方法,包括初始化方法`__init__()`、表示方法`__repr__()`、`__str__()`等。还特别讲解了特殊方法`__new__()`和`__call__()`的用法,`__new__()`在创建对象时起作用,而`__call__()`使得对象可以像函数一样被调用。文章通过实例解析了这些魔法方法在面向对象编程中的应用。
摘要由CSDN通过智能技术生成

类的魔法方法实质是 python 的内置方法,不需要主动调用。当我们在进行某种类的运算或操作时,python的解释器会自动调用相应的魔法方法。

类的魔法方法总是被双下划线所包围,一般格式为:"__ 方法名__",它们功能强大,充满魔力。通过重载,魔术方法的实际功能可以根据实际需要进行更改。例如: __ init__() 就是一个典型的魔法方法,当创建对象时会被系统调用,在定义类时,也可以根据需要设置它的实际功能。

一、基本魔法方法

x.__ init__() ———— 创建对象后:MyObj = MyClass()
x.__ repr__() ———— repr(x)
x.__ str__() ———— str(x)
x.__ bytes__() ———— bytes(x)
x.__ format__(format_spec) ———— format(x, format_spec)
seq.__ iter__() ———— iter(seq)
seq.__ next__() ———— next(seq)
seq.__ reversed__() ———— reversed(seq)

x.__ getattribute__(‘my_property’) ———— x.my_property
x.__ getattr__(‘my_property’) ———— x.my_property
x.__ setattr__(‘my_property’, value) ———— 设置一个属性:x.my_property = value
x.__ delattr__(‘my_property’) ———— del x.my_property
x.__ dir__() ———— dir(x)
my_instance.__ call__() ———— "调用"像函数一样的实例:my_instance()
s.__ len__() ———— len(s)
s.__ contains__(s) ———— 否包含特定的值:x in s
x.__ getitem__(key) ———— x[key]
x.__ setitem__(key, value) ———— 通过key来设置一个值:x[key] = value
x.__ delitem__(key) ———— del x[key]
x.__ missing__(nonexistent_key) ———— 为丢失的key提供默认值:x[nonexistent_key]

二、运算魔法方法

x.__ add__(y)、x.__ radd__(y) ———— x + y
x.__ sub__(y)、x.__ rsub__(y) ———— x - y
x.__ mul__(y)、x.__ rmul__(y) ———— x * y
x.__ trueiv__(y)、x.__ rtrueiv__(y) ———— x / y
x.__ floordiv__(v)、x.__ rfloordiv__(v) ———— x // y
x.__ mod__(y)、x.__ rmod__(y) ———— x % y
x.__ divmod__(y)、x.__ rdivmod__(y) ———— divmod(x, y)
x.__ pow__(y)、x.__ rpow__(y) ———— x ** y
x.__ lshift__(y)、x.__ rlshift__(y) ———— x << y
x.__ rshift__(y)、x.__ rrshift__(y) ———— x >> y

x._ and_(y)、x.__ rand__(y) ———— 按位与运算:x & y
x.__ or__(y)、x.__ ror__(y) ———— 按位或运算:x | y
x.__ xor__(y)、x.__ rxor__(y) ———— 按位异或运算:x ^ y

前缀“r”有与无的区别,以加法 x+y 为例:
1、x 有 __ add__ 方法,且不返回 NotImplemented,则调用x.__ add__(y)。
2、x 没有 __ add__ 方法,或者调用 __ add__ 方法返回 NotImplemented,则检查 y 有没有 __ radd__ 方法,如果有,且不返回 NotImplemented,则调用 y.__ radd__(x)。
3、x 没有 __ add__ 方法,或者调用 __ add__ 方法返回 NotImplemented,且 y 也没有 __ radd__ 方法, 或者调用 __ radd__ 方法返回 NotImplemented,则抛出 TypeError异常。

x.__ iadd__(y) ———— x += y
x.__ isub__(y) ———— x -= y
x.__ imul__(y) ———— x *= y
x.__ itrueiv__(y) ———— x /= y
x.__ ifloordiv__(v) ———— x //= y

x.__ imod__(y) ———— x %= y
x.__ idivmod__(y) ———— 整除与取余:x= divmod(x, y)
x.__ ipow__(y) ———— x **= y
x.__ ilshift__(y) ———— x <<= y
x.__ irshift__(y)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值