python提供了诸多的魔法方法,其中__setattr__()方法主要用于类实例进行属性赋值,其定义在Object类【1】中,官方提供的说明如下:

Called when an attribute assignment is attempted.
This is called instead of the normal mechanism (i.e. store the value in the instance dictionary).name is the attribute name, value is the value to be assigned to it.

简单的说,__setattr__()在属性赋值时被调用,并且将值存储到实例字典中,这个字典应该是self的__dict__属性。即:在类实例的每个属性进行赋值时,都会首先调用__setattr__()方法,并在__setattr__()方法中将属性名和属性值添加到类实例的__dict__属性中

1、实例属性管理__dict__

下面的测试代码中定义了三个实例属性,每个实例属性注册后都print()此时的__dict__,代码如下:

class 

得到的结果显示出,每次实例属性赋值时,都会将属性名和对应值存储到__dict__字典中:

{

2、__setattr__()与__dict__

由于每次类实例进行属性赋值时都会调用__setattr__(),所以可以重载__setattr__()方法,来动态的观察每次实例属性赋值时__dict__()的变化。下面的Fun类重载了__setattr__()方法,并且将实例的属性和属性值作为__dict__的键-值对:

class 

通过在__setattr__()中将属性名作为key,并将属性值作为value,添加到了__dict__中,得到的结果如下:

**************************************************

可以看出,__init__()中三个属性赋值时,每次都会调用一次__setattr__()函数。

3、重载__setattr__()必须谨慎

由于__setattr__()负责在__dict__中对属性进行注册,所以自己在重载时必须进行属性注册过程,下面是__setattr__()不进行属性注册的例子:

class 

由于__setattr__中并没有将属性注册到__dict__中,所以not_fun对象并没有name属性,因此最后的print(not_fun.name)会报出属性不存在的错误:

AttributeError                            

所以,重载__setattr__时必须要考虑是否在__dict__中进行属性注册。

总结

python的实例属性的定义、获取和管理可以通过__setattr__()和__dict__配合进行,当然还有对应的__getattr__()方法,本文暂时不做分析。__setattr__()方法在类的属性赋值时被调用,并通常需要把属性名和属性值存储到self的__dict__字典中。

参考

【1】https://docs.python.org/3/reference/datamodel.html?highlight=object%20__setattr__#object.__setattr__

attributeerror: __enter___python魔法方法之__setattr__()相关推荐

  1. python 内置属性__setattr___python魔法方法之__setattr__()

    python提供了诸多的魔法方法,其中__setattr__()方法主要用于类实例进行属性赋值,其定义在Object类[1]中,官方提供的说明如下: Called when an attribute ...

  2. python 魔法方法常用_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  3. python __reduce__魔法方法_Python魔法方法指南

    (译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法" ...

  4. Python之魔法方法详解

    转载于: https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html 11.1. 简介 本指南归纳于我的几个月的博客,主 ...

  5. python魔法方法长文详解

    python魔法方法详解 1. 什么是魔法方法 魔法方式(Magic methods)是python的内置函数,一般以双下划线开头和结尾,比如__add__,__new__等.每个魔法方法都有对应的一 ...

  6. Python魔法方法

    文章目录 Python魔法方法 一. 概述 1. 魔法方法 2. 常用的魔法方法 二. 构造方法 1. `__new__` 2. `__init__` 3. `__del__` 三. 操作符 1. 简 ...

  7. Python魔法方法指南

    转自:http://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html 原文: http://www.rafekettler.c ...

  8. Python-面向对象-魔法方法(未完待续)

    目录 一.属性相关的魔法方法 (1) __getattribute__ (2)__getattr__ (3)__setattr__ (4)__delattr__ 二,容器魔法方法 (1)__len__ ...

  9. Python的魔法方法总结

    转自:http://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html 原文: http://www.rafekettler.c ...

最新文章

  1. 检查IP是否可用的方法
  2. 配置虚拟机和网络配置
  3. 从X86向X64迁移的一点心得
  4. powershell 查看系统设备\device status
  5. Java GregorianCalendar getMaximum()方法与示例
  6. 基于jQuery日历插件制作日历
  7. 蓝桥杯练习题:对给定整数基于斐波拉契数列构造字符串
  8. 单元测试用例编写总结 (白盒测试)
  9. Scratch二次开发6:如何保存作品到自己的服务器
  10. Win7 64位操作系统连接HP 1010打印机完美解决方案
  11. 如何创建强命名程序集
  12. 曾国藩读书的十二条规矩
  13. h61 nvme硬盘_谁更快?PCIe 4.0时代的NVMe固态硬盘性能对决
  14. Windows7中随意排列图标(自动排列,对齐到网络)
  15. linux 存储结构与磁盘划分详解
  16. 香侬科技李纪为:初入NLP领域的一些小建议
  17. Python实例26:佛祖镇楼
  18. KILE5生成bin文件
  19. vueuse(函数库)的基本使用,宝藏神器,务必收藏
  20. Trie 字符串统计+最大异或对

热门文章

  1. java setlayout_Java Button.setLayoutX方法代码示例
  2. getter 和 setter方法
  3. android 下拉刷新实现方式,Android RecyclerView设置下拉刷新的实现方法
  4. ajax中data传参报错
  5. Java基础01 1个和2个区别比较
  6. ROS入门笔记(五):ROS中运行rqt_plot的问题(kinetic)
  7. matlab计算三角格网面积,不规则平面图形的面积计算及其MATLAB实现.doc
  8. 实体 联系 模型mysql_数据库实体联系模型与关系模型
  9. vue 方法获取返回值_vue中子组件怎么获取父组件中的方法的返回值
  10. 用与非门设计血型配对电路_利用与非门CD4011做一个防盗报警器,那些高大上就这么简单...