在类的构造方法__init__对类的属性赋值时,会自动调用__setattr__方法。

问题一:

如果只设置一个属性的值时,只调用一次__setattr__方法;如果给多个属性赋值时,python是如何处理的呢?是每给一个属性赋值时,调用一次__setattr__方法呢,还是全部属性赋值时只调用一次__setattr__方法呢?
本人查了一些资料,都没有具体说明,因此,做了一个测试,结果证明,是每给一个属性赋值时,调用一次__setattr__方法,需要给几个属性赋值,就调用几次__setarrt__方法。
参见下例代码:

class Rectangle:def __init__(self,width,height) :print('第一次设置属性')self.width = widthprint('第二次设置属性')self.height = heightdef __setattr__(self,name,value) :print('---设置%s属性' % name)if name == 'size' :self.width, self.height = valueelse :self.__dict__[name] = value

输出如下:
第一次设置属性
—设置width属性
第二次设置属性
—设置height属性

问题二:

查找相关资料发现,在使用__setattr__方法时,不能再次直接对属性赋值,否则代码会陷入死循环(原因是在__setattr__方法再次直接对属性赋值时,仍会自动调用__setattr__方法)。那么,如果需要在__setattr__方法内部对属性赋值怎么办呢?
有两个方法,一是通过字典(dict)进行操作;二是通过super()调用父类方法进行操作。
代码如下:

class Rectangle:def __init__(self,width,height) :print('第一次设置属性')self.width = widthprint('第二次设置属性')self.height = heightdef __setattr__(self,name,value) :print('---设置%s属性' % name)if name == 'size' :self.width, self.height = valueelse :self.__dict__[name] = value  #利用字段对name属性赋值#super().__setattr__.(name)   #调用父类方法#self.name = value            #会陷入死循环

读者可以通过注释下列不同代码来测试其效果。

rect = Rectangle(3,4)
#print(rect.size)
rect.size = 6,8
print(rect.width,rect.height)
#del rect.size
#print(rect.size)

当前代码输出如下:
第一次设置属性
—设置width属性
第二次设置属性
—设置height属性
—设置size属性
—设置width属性
—设置height属性
6 8

python中__setattr__的探索相关推荐

  1. Python中变量的本质探索

    Python中变量的本质探索 参考:Vamei博客Python进阶09 动态类型 ''' a = [1,2,3] ''' (1)这条"赋值语句"实际上是将a指向对象"[1 ...

  2. python在人工智能应用锁_干货 | Python人工智能在贪吃蛇游戏中的应用探索(上)...

    文案&代码 白宇啸 排版&审校 邓发珩 前言 一个月前,人工智能对我来说都是很陌生的,更不用说神经网络.强化学习.DQN等名词了.疫情期间,经过在家努力学习,我对这些概念越来越清晰了, ...

  3. python在教育领域的应用课题_项目式教学在高中信息技术教学中的应用探索——以Python基本程序结构教学为例...

    项目式教学在高中信息技术教学中的应用探索--以 Python基本程序结构教学为例 宋芹芹 济南西城实验中学 摘要:教学改革思想理念的深入发展,要求教师在课堂教学中不断尝试新鲜模式.在高中信息技术课堂教 ...

  4. python中query函数-Pandas探索之高性能函数eval和query解析

    Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高 ...

  5. python中的class类使用方法[探索3]

    python中的scope和namespace (1)namespace是名字和对象的映射,多数名称空间使用dict来实现,不同namespace中的名称没有关系. (2)模块.xx, xx表示模块对 ...

  6. python中的isinstance()使用方法[探索2]

    isinstance 学习的是以下博客: https://blog.csdn.net/HS_blog/article/details/81396664 1.功能 判断python中的设定函数的类型 2 ...

  7. Python中的元类是什么?

    元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...

  8. Python基础与拾遗9:Python中的函数与作用域

    Python基础与拾遗9:Python中的函数与作用域 函数的作用 函数的设计理念 Python中的函数 Python中的函数关键字 Python中的多态 Python中函数的参数传递 Python中 ...

  9. Python中的静态类变量和方法

    问: 如何在 Python 中创建静态类变量或方法? 答1: huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效. 在类定义内但不在方法内声明的变量是 ...

最新文章

  1. MySQL 狠甩 Oracle 稳居 Top1,私有云最受重用,大数据人才匮乏! | 中国大数据应用年度报告...
  2. ExtJS 开发调试工具大全
  3. UDP:用戶数据报协议(读书笔记之二)
  4. 大批机器人上岗,会影响工作吗,为何我们必须发展人工智能?
  5. vue-resource安装
  6. pdf 改变页面大小 python_python – 裁剪.pdf文件的页面
  7. 模拟,贪心,枚举(二)
  8. 多少并发量算高并发_Linux服务端最大并发数是多少?
  9. 学习笔记(五)——相关系数及Excel实现相关分析操作
  10. 搜狗浏览器查看账号密码
  11. install pecl php_Linux下 PHP 安装pecl_http方法
  12. 深度学习中使用Screen 指令进行离线训练
  13. 通讯:岁寒情深 电暖农村
  14. 今天咱爬点不一样的!获取华为应用商店app信息!
  15. 【年度榜单】2020大数据产业创新服务产品丨数据猿·金猿榜
  16. win10c语言关机,技术员win10系统如何利用Shutdown.exe程序定时关机?
  17. 时间换算(C语言结构)
  18. 2018最新破解pycharm安装过程(含注册码)
  19. java获取系统信息
  20. 基于深度学习的近红外掌纹识别原型系统设计与实现

热门文章

  1. JAVA的基础练习题
  2. 【C++】高斯消元算法
  3. 信息学奥赛一本通 1955:【11NOIP普及组】瑞士轮 | OpenJudge NOI 4.1 4363:瑞士轮 | 洛谷 P1309 [NOIP2011 普及组] 瑞士轮
  4. python打开交互界面设计_老司机必备——用PyQt做一个有交互界面的妹子图爬虫...
  5. 小米系统MIUI安装busybox
  6. python 游戏大作_Linux下游戏大作赏析(二)
  7. unc 目录不受支持_[Bat]UNC路径不支持的2种解决方法
  8. PAT (Top Level) Practice1005 Programming Pattern (35 分)
  9. [639]极验验证码破解分析
  10. java.lang.NoClassDefFoundError: org/aptech/hdax/pojo/sysUser (wrong name: org/aptech/hdax/pojo/SysUs