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. App.config自定义节点读取

    <?xml version="1.0" encoding="utf-8"?> <configuration> <!--<ot ...

  2. 如何在ADO中使用数据读取器(DataReader)读取数据

    DbDataReader类型(实现IDataReader接口)是从数据源获取信息最简单也最快速的方法. 数据读取器是只读向前的效据流.井且一次返回一条记录.因此.只有当你向数据源提交 Select 查 ...

  3. centos安装jenkins

    1.安装jdk yum install java java -version 2.安装jenkins 添加Jenkins库到yum库,Jenkins将从这里下载安装. wget -O /etc/yum ...

  4. Spring MVC(三)控制器获取页面请求参数以及将控制器数据传递给页面和实现重定向的方式

    首先做好环境配置 在mvc.xml里进行配置 1.开启组件扫描 2.开启基于mvc的标注 3.配置试图处理器 <?xml version="1.0" encoding=&qu ...

  5. vue中v-text / v-html

    vue中v-text / v-html使用 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. <自动化测试方案_9>第九章、持续集成平台搭建

    第九章.持续集成平台搭建 (一)什么是持续集成 参考文章地址:https://blog.csdn.net/qq_32261399/article/details/76651376 敏捷软件开发(英语: ...

  7. 阿里云服务器,Sql Server 本地连接服务器端问题记录

    1.如果你是阿里云服务器,配置参数都整好了并且排除了防火墙问题(关闭了防火墙),依然没有连接上,那就先考虑这个问题 问题:阿里云服务器的SQLServer不允许远程连接 原因:因为除了服务器上的防火墙 ...

  8. 关于 python中的 TKinterlistbox 控件加横竖滚动条

    上代码 win=tkinter.Tk() scorllbar=tkinter.Scrollbar(win) scorllbar.pack(side=tkinter.RIGHT,fill=tkinter ...

  9. 使用Linq的过程中碰到的问题

    1. 在使用linq过程DefaultIfEmpty的过程中如果 O.RS 这个支段的值是null,在取这个数据 就会报错 ,正确的写法 2. 在使用Linq 用where条件判断要好分辨大小写 3. ...

  10. git之命令git checkout

    git checkout 最常用的就是切换分支,最近又发现一种新的用法: 有时候,在看代码的时候,不小心改动了部分代码,但跟项目没啥关系,这个时候,想不去提交这些代码,怎么处理呢? 使用git che ...