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 ...
随机推荐
- java类与实例
最近在看设计模式,感觉自己对java的三大特性的理解不够清晰,搞不清楚抽象类.接口.泛型的用处和优缺点.设计模式学了一半,想着还是停下来脑补一下java的基础,就从java对象开始吧. 一.java对 ...
- Elasticsearch Java 虚拟机配置详解
Elasticsearch对Java虚拟机进行了预先的配置.通常情况下,因为这些配置的选择还是很谨慎的,所以你不需要太关心,并且你能立刻使用ElasticSearch. 但是,当你监视ElasticS ...
- 关于docker
摘要: 最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术.为此,我们列了一个路线图供大家学习Docker和阿里云容器服务.这个列表包含了一些社区的优秀资料和我们的原创文章.我们会随着 ...
- Sublime Text通过插件编译Sass为CSS及中文编译异常解决
虽然PostCSS才是未来,但是Sass成熟稳定,拥有一大波忠实的使用者,及开源项目,且最近Bootstrap 4 alpha也从Less转到Sass了.所以了解Sass还是非常有必要的. 基于快速开 ...
- 如何利用FineReport制作动态树报表
在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...
- jQuery fsBanner 手风琴
fsbanner是一款自定义功能丰富的响应式网站Banner手风琴特效jQuery插件.该手风琴特效兼容性很好,支持点击和鼠标滑过等触发事件,并且可添加标题或描述. 在线实例 默认 带标题 鼠标滑过 ...
- 基于位图(Bitmap、BitmapData)的图片处理方法(C#)
目前操作位图的主流方法有三种: 1.基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主.方法调用简单,但是效率偏低. 2.基于内存的像素操作方法,以System.Ru ...
- 详解java定时任务
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析JavaTimer定时器. ...
- [数据科学] 从text, json文件中提取数据
文本文件是基本的文件类型,不管是csv, xls, json, 还是xml等等都可以按照文本文件的形式读取. #-*- coding: utf-8 -*- fpath = "data/tex ...
- 树莓派3B初始化后一些必须的设置
接上一篇,SSH已经登录成功(http://www.cnblogs.com/crosys/p/6220108.html) 1.树莓派系统的设置 1.1扩展系统空间 因为内存卡还有很多空间没有分配,第一 ...