持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 getter
如下代码:我直接调用不存在的c会直接给我个报错,那么我想拥有上篇最下面写的demo,当不存在自动帮我返回一个内容,比如打印一串友好的提示。
class Demo:
def __init__(self, a, b):
self.a = a
self.b = b
d = Demo(1, 2)
print(d.c)
确实有处理该问题的,内置的方案,只要在类里实现__getattr__,并且返回出去即可。如下图:当不存在时,自动提示某某不存在,而不是直接报错。如下图:
当属性存在时,调用属性,不存在时在调用。那怎么确定它们之间的优先级呢:以下图为例--> d.__dict > d.__class__.__dict__ > a.__getattr__。
2 setattr
如下图:会发现在初始化的时候,就会打印__setattr__里的内容,而且d.c =123,我添加一个属性也是会调用的。但是当我调用它,竟然提示没有它,可以使用__dict__查看,结果应该是空的。
也就说没有属性,那我可以不可以在__setattr__中使用setattr添加呢,如下图:会产生递归,最后来个报错,这不是我们想要的结果。
还有一种就是直接修改self.__dict__[prop] = value,看着也是可以的吧。但是也是有局限性,当我在定义一个实例,c是不存在的。__setattr__的坑比较多,平时很少用到。
总结
若是遇到了访问不存在的成员但是又不想它报错,并且还要去处理报错,这时只要在类里定义一个__getter__方法,不存在直接调用它,是不是方便好多了。__setattr__了解即可,不建议使用它。