持续创作,加速成长!这是我参与「掘金日新计划 · 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()
既然是字典那么我想得到age的值,既可以实例.age,也可以实例.__dict__[key]获取值。
既然查看可以,修改值应该也是可以的。
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__存放实例属性的,就可以通过一下子拿到值,并且它的类型是字典。运算符重载可以看作是语法糖,了解即可。