__setattr__陷阱

引子:

  使用  对象.xxx=213 这种方法赋值的时候 会隐式的调用__setattr__方法

代码:

  

# -*- coding: utf-8 -*-



class foo(object):
    def __init__(self):
        self.storage={}


    def __setattr__(self, key, value):
        self.storage={"k1":"v1"}
        print(key,value)

    def __getattr__(self, item):
        print(item)
        return "dsfds"

"""
陷阱 如果代码这样写 会报递归深度错误
    推倒过程如下
        1  obj=foo() 会调用__init__() 方法,其内部的self.storage={} 会调用 __setattr__ 方法
        2  __setattr__ 内部又调用了self.storage={"k1":"v1"} 又一次调用 __setattr__
        3 最终超过最大递归深度 报错
        
    ps:
       对象.xx=234 这种调用的时候默认隐式调用__setattr__ 方法 

"""
obj=foo()
obj.x=77


# 解决方法 调用父类的 __setattr__
class cls_a:
    def __init__(self):
        object.__setattr__(self,"storage",{})

  类中如果使用了其他的方法名字 代替了__setattr__的时候就不会出现这种问题  下方代码 set方法中调用了 __setattr__方法

class Local(object):
    def __init__(self):
        self.storage={}
        self.get_ident=get_ident

    def set(self,k,v):
        ident=self.get_ident()
        orgin=self.storage.get(ident)
        if not orgin:
            orgin={k:v}
        else:
            orgin[k]=v
        self.storage[ident]=orgin

    def get(self,k):
        ident=self.get_ident()
        orgin=self.storage.get(ident)
        if not orgin:
            return None
        return orgin.get(k,None)

  

posted @ 2021-02-07 23:45  Yuan_x  阅读(79)  评论(0编辑  收藏  举报