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

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

python中的__dict__,__getattr__,__setattr__的更多相关文章

  1. 【Python】python中的__dict__,__getattr__,__setattr__

    Python class 通过内置成员__dict__ 存储成员信息(字典) 首先用一个简单的例子看一下__dict__ 的用法 class A(): def __init__(self,ax,bx) ...

  2. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  3. python中dir,__dict__ , __setitem__(),__getitem__()

    class Testa: pass class Testb(object): pass if __name__ == '__main__': print 'testb = ',dir(Testb) p ...

  4. python中的__dict__和dir()的区别

    Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: __di ...

  5. python中dir(),__dict__

    dir()是python的一个函数, dir()函数如果接受的参数是一个类,则返回这个类所有的类变量和方法 dir()函数如果接收的参数是一个类的实例,则返回这个实例所有的实例变量,对应的类的类变量, ...

  6. python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__

    __getattr__:     属性查找失败后,解释器会调用 __getattr__ 方法. class TmpTest: def __init__(self): self.tmp = 'tmp12 ...

  7. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

  8. python中__getattr__和__setattr__

    代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value) ...

  9. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

随机推荐

  1. docker run 之后执行多条命令

    执行 ls docker run microsoft/dotnet ls && cd /root 执行 多条使用sh -c命令 在run后面加了一个sh -c命令,后面直接加多条语句即 ...

  2. int16, int32, int64等类型说明

    Int16  相当于 short  占2个字节   -32768 ~ 32767 Int32  相当于 int      占4个字节   -2147483648 ~ 2147483647 Int64  ...

  3. oracle锁表与解表

    查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...

  4. APP 技术支持

    APP使用过程中,有任何问题,可以在此博客下方留言. 或者,发送邮件到邮箱:nbglsoft@163.com 反馈的任何问题,我们将在2个工作日内进行响应. 感谢大家的支持!

  5. [C#学习笔记1]用csc.exe和记事本写一个C#应用程序

    csc.exe是C#的命令行编译器(CSharpCompiler),可以编译C#源程序成可执行程序.它与Visual Studio等IDE(Integrated Development Environ ...

  6. STL源码剖析-vector

    STL(Standard Template Library) C++标准模板库,acm选手一定对它不陌生,除了算法,那几乎是“吃饭的家伙了”.我们使用库函数非常方便,且非常高效(相对于自己实现来说). ...

  7. JPA实现复杂条件分页查询

    相信熟悉Hibernate的人对于ORM给编程带来的便利于快捷一定不陌生,相对于MyBatis等需要编写复杂的SQL语句,ORM映射为我们带来的便利显而易见.但是,在获得便利的同时,失去的便是灵活性, ...

  8. Audio播放

    <audio controls="controls" id="warnAudio" hidden> <source src="~/m ...

  9. 搭建ES6开发环境

    https://github.com/IOJINDD/ES6-dev 在gulpfile最后一行加上: gulp.task('default', ['compile-es6', 'pack-js', ...

  10. golang web实战之二(iris)

    之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1.  iris hello world package main import &quo ...