代码:

#!/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__的更多相关文章

  1. 第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析

    一. 引言 前面几节分别介绍了Python中属性操作捕获的三剑客:__ getattribute__方法.__setattr__方法.__delattr__方法,为什么__ getattribute_ ...

  2. 浅谈Python 中 __getattr__与__getattribute__的区别

    __getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...

  3. python中的__dict__,__getattr__,__setattr__

    python class 通过内置成员dict 存储成员信息(字典) 首先用一个简单的例子看一下dict 的用法 class A(): def __init__(self,a,b): self.a = ...

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

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

  5. __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

    自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...

  6. python中的 descriptor

    学好和用好python, descriptor是必须跨越过去的一个点,现在虽然Python书籍花样百出,但是似乎都是在介绍一些Python库而已,对Python语言本身的关注很少,或者即使关注了,但是 ...

  7. Python中的属性管理

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

  8. python中的metaclass

    首先看下面的代码: # coding: utf-8 class Test(object): pass print Test.__class__ # type print Test.__base__ # ...

  9. python中基于descriptor的一些概念

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

随机推荐

  1. Django Admin 录入中文错误解决办法

    如果报错....for column 'object_repr' at row 1.就找到此列所在表为django_admin_log,然后插入: ALTER TABLE django_admin_l ...

  2. Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)

    在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ...

  3. [转]HttpModule的认识

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  4. 初识java之String与StringBuffer(上)

    好久没写博客了,一直在纠结后面的路怎么发展?好了不说废话了!!正题开始!! String与StringBuffer类是我们在开发中最常用的,我们现在一起来分析一下这两个类,首先我们先来谈谈String ...

  5. JQuery plugin ---- simplePagination.js API

    CSS Themes "light-theme" "dark-theme" "compact-theme" How To Use Step ...

  6. 后记:IT软件人员学习的书籍 - IT软件人员书籍系列文章

    1年了,软件人员学习书籍系列总算是写完了.虽然文字篇幅不多,主要对各个角色的一些基本内容做了介绍,但是更重要的是能够提供相关的人员学习书籍进行下载,让更多的人能够从中学习到更多的知识. 这个系列,从项 ...

  7. C#语言学习记录

    1.&& || ! 与或非-逻辑运算符,&&的优先级大于||.

  8. 【Pyrosim案例】02:简单燃烧

    1 案例说明 本案例介绍一个简单的燃烧模拟. 本案例通过指定热释放率(Heat Release Rate,HRR)来定义一个500kW的燃烧火焰.利用热释放率来定义燃烧火焰在火灾安全工程中描述火焰的一 ...

  9. 大数据慎行,数据管理要落实到KPI

    近年来,"大数据"一词被IT和互联网行业广泛提及,但真正落到实处的案例没有多少,大数据量支撑.数据挖掘技术.非结构化数据是阻碍的主要原因.大多数企业的信息化并没有达到到成熟水平,关 ...

  10. AC日记——最小的N个和 codevs 1245

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...