python中:使用属性魔法方法__getattribute__,__setattr__,__delattr__容易落入的陷阱:死循环!

__getattribute__,__setattr__,__delattr__都是python属性魔法方法中最常见的,但在使用重写他们的时候,有一个小陷阱千万不能踩!

魔法方法很方便,它可以说是向对象的python的一切,但,只要有相应的行为,就会触发相应的魔法方法,这也会导致有的重写魔法方法形式不对,会陷入死循环

下面介绍出现陷阱情况和相应的解决方法。

__setattr__是定义属性被设置时的行为

假设我们要重写__setattr__魔法方法

class A:

    def __setattr__(self,name,value):

        self.name = value

看起来似乎没有问题,当你执行的时候,例如写入

>>>a=A()

>>>a.b=1

就会出现无限递归死循环!

这是因为执行函数里代码时,当执行到self.name = value时,赋值行为会触发__setattr__函数,然后会继续执行函数里的代码,继而再次触发__setattr__函数,这就成了一个不可解的死循环。

破解的方法有两种:

1、我们去调用系统写好的基类,系统的总是最安全的!super()可以帮你找到所有函数的父类

def __setattr__(self,name,value):

    super().__setattr__(name,value)

2、我们要用到一个对象的特殊属性:__dict__它的作用是以字典的属性显示出当前对象的所有属性以及对应的值!比如:{'b': 1}

def __setattr__(self,name,value):

    self.__dict__[name] = value


同理,__getattribute__:是定义该属性被访问时的行为,

__delattr__:定义属性被删除时的行为,

按照上面方式重写魔法方法时,__getattribute__会一直获得,__delattr__会一直删除而陷入死循环

而他们的解决方法,和上面写的一样,有两种方法,都可以选择使用。

童鞋们可以自己写下来验证一下~

使用魔法方法时,我们要了解他们的内在逻辑,才能更好地使用。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页