Python class 通过内置成员__dict__ 存储成员信息(字典)

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

class A():
def __init__(self,ax,bx):
self.a = ax
self.b = bx
def f(self):
print (self.__dict__)
a = A(1,2)
a.f()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果:{‘b’: 2, ‘a’: 1}

利用__dict__ 可以达到一些简化代码的目的,参考下面的例子


class Person:
def __init__(self,_obj):
self.name = _obj['name']
self.age = _obj['age']
self.energy = _obj['energy']
self.gender = _obj['gender']
self.email = _obj['email']
self.phone = _obj['phone']
self.country = _obj['country']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

简化成下面的代码


class Person:
def __init__(self,_obj):
self.__dict__.update(_obj)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

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

class A():
def __init__(self,ax,bx):
self.a = ax
self.b = bx
def f(self):
print (self.__dict__)
def __getattr__(self,name):
print ("__getattr__")
a = A(1,2)
a.f()
a.x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果

{'b': 2, 'a': 1}
__getattr__
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

__setattr__ 方法用于在初始化对象成员的时候调用,即在设置__dict__的item时就会调用__setattr__方法。 具体看下面的例子

class A():
def __init__(self,ax,bx):
self.a = ax
self.b = bx
def f(self):
print (self.__dict__)
def __getattr__(self,name):
print ("__getattr__")
def __setattr__(self,name,value):
print ("__setattr__")
self.__dict__[name] = value a = A(1,2)
a.f()
a.x
a.x = 3
a.f()

输出结果

__setattr__
__setattr__
{'a': 1, 'b': 2}
__getattr__
__setattr__
{'a': 1, 'x': 3, 'b': 2}

最新文章

  1. 思维导图MindManager的文件格式与例图
  2. 关于PetaPoco的T4模板使用
  3. cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
  4. 安装python 的 包 paramiko
  5. ref、out
  6. Http协议网络对时工具
  7. 修改登录linux之后显示的默认文件夹目录
  8. HTML5文件上传还有进度条
  9. hihocoder Challenge 29 D. 不上升序列
  10. day22:初识面向对象
  11. [Android] Android 使用 Greendao 操作 db sqlite
  12. cartographer 最新版安装测试
  13. 国网SGCC_UAP 反编译.class文件源代码
  14. HDU 5844 LCM Walk(数学逆推)
  15. href="javacript:;" href="javacript:void(0);" href="#"区别。。。
  16. 重识linux-压缩文件的原理
  17. HDFS之FileStatus
  18. 转 Linux下Nginx+PHP+MySQL配置
  19. win7系统总是安装不了net2.0的解决方法
  20. Linq 对List的一些操作

热门文章

  1. Oracle数据库中 to_date()与to_char()函数的用法
  2. Oracle数据库补充
  3. Hibernate知识点小结(二)
  4. MySQL的数据类型(一)
  5. iframe优缺点
  6. 内存分配---FF、BF、WF三种算法
  7. jdbc最基础的mysql操作
  8. 23种java设计模式之装饰者模式及动态代理
  9. jquery获取周对应的日期
  10. Asp.Net Core 使用Docker进行容器化部署(一)