zoukankan      html  css  js  c++  java
  • python中的__dict__,__getattr__,__setattr__

    python class 通过内置成员dict 存储成员信息(字典)

    首先用一个简单的例子看一下dict 的用法

    class A():
        def __init__(self,a,b):
            self.a = a
            self.b = b
        def f(self):
            print (self.__dict__)
    a = A(1,2)
    a.f()
    输出结果:{‘b’: 2, ‘a’: 1}
    

    我们可以通过重载getattr和setattr来拦截对成员的访问或者作出一些自己希望的行为
    getattr 在访问对象访问类中不存在的成员时会自动调用

    class A():
        def __init__(self,a,b):
            self.a = a
            self.b = b
        def f(self):
            print (self.__dict__)
        def __getattr__(self,name):
            print ("__getattr__")
    a = A(1,2)
    a.f()
    a.x
    

    setattr 方法

    class A(object):
        def __init__(self,a,b):
            print('start init')
            self.a=a  #赋值语句会被__setattr__拦截
            self.b=b
            print('end init')
        def f(self):
            print(self.__dict__)#因为赋值语句被拦截,所以不能将内置成员存储成(字典)
        def __getattr__(self, name):
            print('__getattr__')
        def __setattr__(self, name,value):
            print('1__setattr__')
            self.__dict__[name]=value
            print('2__setattr__')
    a=A(2,3)
    print('---------')
    a.aa=33

    运行结果

    如下:

    start init
    1__setattr__
    2__setattr__
    1__setattr__
    2__setattr__
    end init
    ---------
    1__setattr__
    2__setattr__
    

    __setattr__
    会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__setattr__("attr", value).这个需要注意。
    当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成无穷递归循环,
    最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value


    如j.name=5 就会调用__setattr__方法 self.[name]=5
    因为这个类是从dict继承来的,是dict的超类
    所以 self[attr]=value 相当于调用dict的下标方法
    与 a={} ; a[attr]=value意思一样

     注意:是拦截实例的赋值,类的赋值不能拦截

  • 相关阅读:
    Oracle Autonomous Health Framework(AHF)
    Autonomous Health Framework(AHF)相关操作
    Postgresql 正则表达式
    如何去官网下载JDK (JDK8 JDK1.8)
    配置免安装版Oracle客户端
    子用户角色权限菜单 浅谈:子账户设计方案
    EF Power Tools Beta 2 生成 Entity Framework Code First 提示 参数错误 hresult e_invalidarg
    mvc 截取上传图片做头像,自动生成不同小尺寸缩略图
    亚马逊的下拉菜单插件 jQueryMenuAim 使用
    apacheab并发负载压力测试
  • 原文地址:https://www.cnblogs.com/zuxing/p/9121674.html
Copyright © 2011-2022 走看看