python笔记 运算符重载

59 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 专有方法补充

假设有这么个需要,我想看看我实例属性都有哪些,我懒的一个个看了,dict就是针对实例的指定属性,也就说__dict__用来存放实例对应所有的属性,用法实例.__dict__

当我们首次得到一个demo实例,现在里面是空的,打印的结果也是{},没问题,然后demo.age赋值,验证上面说的对否,打印得到一个键值对,看着像字典,type验证下,验证没问题。

class Demo:
    pass

def main():
    demo = Demo()
    print("demo -->", demo.__dict__)
    demo.age = 123
    print("demo -->", demo.__dict__)
    print(f"类型 --> {type(demo.__dict__)}")

if __name__ == "__main__":
    main()

image.png

既然是字典那么我想得到age的值,既可以实例.age,也可以实例.__dict__[key]获取值。 image.png

既然查看可以,修改值应该也是可以的。 image.png

2 运算符

比如我想一个类初始化a和b,现在呢,定义两个实例,类(1,2)和类(3, 4),我的目标就是两个实例可以相加,比如1+3, 2+4,变成类(4, 6)。我们可以在类中加个add方法,如下:

class Demo:
    def __init__(self, a, b):
        self.a = a
        slef.b = b
        
    def add(self, val):
        return Demo(self.a + val.a, self.b + val.b)

d1= Demo(1, 2)
d2= Demo(3, 4)
d3 = d1.add(d2)
print(d3.a)
print(d3.b)

是不是很容易懂,直接d1+d2会报错的,但是呢,我就想它俩直接相加,得到结果d3,这里需要重写__add__方法,如下:

直接将之前的add变为__add__就可以了,就可以实现了重载运算符,然而有加就有减法(__sub__)、乘法(__mul__)和除法(__divmod__)等,还有其他用的不多,比如位运算法,成员运算符。

def __add__(self, val):
    return Demo(self.a + val.a, self.b + val.b)

3 总结

虽然这些用不到的可能性更大,但是更有助于我们了解,原来__dict__存放实例属性的,就可以通过一下子拿到值,并且它的类型是字典。运算符重载可以看作是语法糖,了解即可。