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意思一样

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

  • 相关阅读:
    self 和 super 关键字
    NSString类
    函数和对象方法的区别
    求两个数是否互质及最大公约数
    TJU Problem 1644 Reverse Text
    TJU Problem 2520 Quicksum
    TJU Problem 2101 Bullseye
    TJU Problem 2548 Celebrity jeopardy
    poj 2586 Y2K Accounting Bug
    poj 2109 Power of Cryptography
  • 原文地址:https://www.cnblogs.com/zuxing/p/9121674.html
Copyright © 2011-2022 走看看