引言
python 类中有很多类似于 "__*__" ( * 前后各有两个下划线) 的方法
那么今天,我们就来探究一下它们吧!
class Number 代码
本文中,我们使用以下例子来探究:
class Number:
"""一次模拟数字的简单尝试"""
__init__
首先,是大家最熟悉的__init__方法
它会在实例对象被创建时调用
用于初始化实例对象的属性
class Number:
"""一次模拟数字的简单尝试"""
def __init__(self, value):
"""Number 对象有 value 属性"""
self.value = value
__str__
这个方法用于生成"对用户友好"的字符串表示形式
一般由函数 print 等来调用
鉴于此处不需要专业的表示形式
故不用 __rper__
def __str__(self):
"""Number 对象的字符串形式"""
return str(self.value)
__str__ 方法有返回值且必须是 str 类型
n1 = Number(10)
print(n1) # 10
__add__
既然是数字类,那我们肯定希望它支持 + 运算符
但是,目前调用会报错:
number1 = Number(10)
print(number1 + 10) # 这是行不通的!
此时,就需要魔术方法 __add__ 出手了!
__add__ 方法用来定义对象的 + 运算符的方法
一般不直接修改对象,而是返回运算结果
且它一般有参数 self 和 other
例如:
def __add__(self, other: int | float or "Number"):
return Number(self.value + other.value if isinstance(other, Number)
else self.value + other)
__add__ 方法由 python 来调用
也就是说,没有 my_obj.__add__(other_obj) 这种写法
只有 my_obj + other_obj 这种写法
number1 = Number(10)
print(number1 + 10) # 20
__radd__
上个示例中,Number + other 不会报错
但用加法交换律反过来 other + Number 却会报错
这不符合预期
所以,我们还要实现用于实例在 + 右边的 __radd__ 方法
此方法用于处理 other + Number 的情况
def __radd__(self, other: int | float or "Number"):
return Number(other.value + self.value if isinstance(other, Number)
else other + self.value)
一般来说,照搬 __add__ 中的代码就好了
__sub__ 和 __rsub__
处理加法的方法都会了,那减法也不成问题了吧
那减法就交给你们来处理了!
结尾
那么今天的python就分享到这
本文只面向初学者
作者是一名12岁的小学生
所以不喜勿喷,如有错误还望指出!
你们的支持是我的最大动力!
还想了解什么就发在评论区吧!
下一篇博客,我们就来唠唠 __iadd__ 和 __isub__!