python笔记 __getter__和__setter__

349 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

image.png

image.png

确实有处理该问题的,内置的方案,只要在类里实现__getattr__,并且返回出去即可。如下图:当不存在时,自动提示某某不存在,而不是直接报错。如下图:

当属性存在时,调用属性,不存在时在调用。那怎么确定它们之间的优先级呢:以下图为例--> d.__dict > d.__class__.__dict__ > a.__getattr__image.png

2 setattr

如下图:会发现在初始化的时候,就会打印__setattr__里的内容,而且d.c =123,我添加一个属性也是会调用的。但是当我调用它,竟然提示没有它,可以使用__dict__查看,结果应该是空的。 image.png

也就说没有属性,那我可以不可以在__setattr__中使用setattr添加呢,如下图:会产生递归,最后来个报错,这不是我们想要的结果。 image.png

image.png

还有一种就是直接修改self.__dict__[prop] = value,看着也是可以的吧。但是也是有局限性,当我在定义一个实例,c是不存在的。__setattr__的坑比较多,平时很少用到。

image.png

总结

若是遇到了访问不存在的成员但是又不想它报错,并且还要去处理报错,这时只要在类里定义一个__getter__方法,不存在直接调用它,是不是方便好多了。__setattr__了解即可,不建议使用它。