python中__getattr__和__setattr__
代码:
#!/usr/bin/env python
#! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
return "xxx" obj = A()
执行操作的代码:
代码1:
print(obj.__dict__)
结果:
{} # 空字典
代码2:
print(obj.name)
结果:
xxx
代码3:
obj.name = 'BBB'
print(obj.__dict__)
print(obj.name)
print(obj.xxx)
结果:
{'name': 'BBB'}
BBB
xxx
总结:
1、当我们第一次获取obj.__dict__的结果是为空的字典。
2、当我们获取对象的某个属性的时候,会先在整个类中找,如过没有则去__getattr__方法里面找,并返回__getattr__中的属性。
3、当我们操作代码obj.name=’BBB’后,此时在类中会自动调用__setattr__方法;所以此时我们再打印obj.__dict__的时候结果会出现我们设置的属性名和属性对应的值组成的字典。
为总结的第二点再次举例说明:
当类中有我们要获取的属性的时候
class A(object):
name = "123" def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
return "xxx" obj = A()
print(obj.__dict__)
print(obj.name)
结果:
{}
123
说明:
此时我们在类中定义了name属性,当我们通过对象获取类中的某个属性的时候,会先在整个类中找,如果有则返回对应的属性,没有则去__getattr__中找并返回的对应属性
当类中没有我们要的属性:
class A(object): def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
return "xxx" obj = A()
print(obj.__dict__)
print(obj.name)
结果:
{}
xxx
验证当类中没有对应的属性的时候,会去__getattr__方法中找:
class A(object): def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
name = "123"
return name obj = A()
print(obj.__dict__)
print(obj.name)
结果:
{}
123
问题:如果要获取的属性这个类中都没,而且__getattr__返回的是一个变量名,那结果会是怎样的?
class A(object): def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
return name obj = A()
print(obj.name)
结果:
name
问题:__getattr__方法中 return 指定的值时,我们获取类中没有的属性,结果怎样?
class A(object): def __setattr__(self, key, value):
self.__dict__[key] = value def __getattr__(self, name):
return "ddd" obj = A()
print(obj.rrr)
结果:
ddd
对总结第三点再次说明:
当对类中设置和修改属性的时候,类中会自动调用__setattr__方法。
python中__getattr__和__setattr__的更多相关文章
- 第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析
一. 引言 前面几节分别介绍了Python中属性操作捕获的三剑客:__ getattribute__方法.__setattr__方法.__delattr__方法,为什么__ getattribute_ ...
- 浅谈Python 中 __getattr__与__getattribute__的区别
__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...
- python中的__dict__,__getattr__,__setattr__
python class 通过内置成员dict 存储成员信息(字典) 首先用一个简单的例子看一下dict 的用法 class A(): def __init__(self,a,b): self.a = ...
- 【Python】python中的__dict__,__getattr__,__setattr__
Python class 通过内置成员__dict__ 存储成员信息(字典) 首先用一个简单的例子看一下__dict__ 的用法 class A(): def __init__(self,ax,bx) ...
- __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)
自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...
- python中的 descriptor
学好和用好python, descriptor是必须跨越过去的一个点,现在虽然Python书籍花样百出,但是似乎都是在介绍一些Python库而已,对Python语言本身的关注很少,或者即使关注了,但是 ...
- Python中的属性管理
Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...
- python中的metaclass
首先看下面的代码: # coding: utf-8 class Test(object): pass print Test.__class__ # type print Test.__base__ # ...
- python中基于descriptor的一些概念
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
随机推荐
- Django Admin 录入中文错误解决办法
如果报错....for column 'object_repr' at row 1.就找到此列所在表为django_admin_log,然后插入: ALTER TABLE django_admin_l ...
- Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)
在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ...
- [转]HttpModule的认识
HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...
- 初识java之String与StringBuffer(上)
好久没写博客了,一直在纠结后面的路怎么发展?好了不说废话了!!正题开始!! String与StringBuffer类是我们在开发中最常用的,我们现在一起来分析一下这两个类,首先我们先来谈谈String ...
- JQuery plugin ---- simplePagination.js API
CSS Themes "light-theme" "dark-theme" "compact-theme" How To Use Step ...
- 后记:IT软件人员学习的书籍 - IT软件人员书籍系列文章
1年了,软件人员学习书籍系列总算是写完了.虽然文字篇幅不多,主要对各个角色的一些基本内容做了介绍,但是更重要的是能够提供相关的人员学习书籍进行下载,让更多的人能够从中学习到更多的知识. 这个系列,从项 ...
- C#语言学习记录
1.&& || ! 与或非-逻辑运算符,&&的优先级大于||.
- 【Pyrosim案例】02:简单燃烧
1 案例说明 本案例介绍一个简单的燃烧模拟. 本案例通过指定热释放率(Heat Release Rate,HRR)来定义一个500kW的燃烧火焰.利用热释放率来定义燃烧火焰在火灾安全工程中描述火焰的一 ...
- 大数据慎行,数据管理要落实到KPI
近年来,"大数据"一词被IT和互联网行业广泛提及,但真正落到实处的案例没有多少,大数据量支撑.数据挖掘技术.非结构化数据是阻碍的主要原因.大多数企业的信息化并没有达到到成熟水平,关 ...
- AC日记——最小的N个和 codevs 1245
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...