python魔法方法之__setattr__()

 更新时间:2022年03月10日 11:32:37   作者:机器学习入坑者  
这篇文章主要介绍了python魔法方法之__setattr__(),python提供了诸多的魔法方法,其中__setattr__()方法主要用于类实例进行属性赋值,接下来请和小编一起进入文章来了解更多相关内容吧

前言:

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

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 AnotherFun:
    def __init__(self):
        self.name = "Liu"
        print(self.__dict__)
        self.age = 12
        print(self.__dict__)
        self.male = True
        print(self.__dict__)
another_fun = AnotherFun()

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

{'name': 'Liu'}
{'name': 'Liu', 'age': 12}
{'name': 'Liu', 'age': 12, 'male': True}

2、__setattr__()与__dict__

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

class Fun:
    def __init__(self):
        self.name = "Liu"
        self.age = 12
        self.male = True
        
    def __setattr__(self, key, value):
        print("*"*50)
        print("setting:{},  with:{}".format(key[], value))
        print("current __dict__ : {}".format(self.__dict__))
        # 属性注册
        self.__dict__[key] = value
fun = Fun()    

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

**************************************************
setting:name,  with:Liu
current __dict__ : {}
**************************************************
setting:age,  with:12
current __dict__ : {'name': 'Liu'}
**************************************************
setting:male,  with:True
current __dict__ : {'name': 'Liu', 'age': 12}

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

3、重载__setattr__()必须谨慎

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

class NotFun:
    def __init__(self):
        self.name = "Liu"
        self.age = 12
        self.male = True
    
    def __setattr__(self, key, value):
        pass
not_fun = NotFun()
print(not_fun.name)

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

AttributeError                            Traceback (most recent call last)
<ipython-input-21-6158d7aaef71> in <module>()
      8         pass
      9 not_fun = NotFun()
---> 10 print(not_fun.name)

AttributeError: 'NotFun' object has no attribute 'name'

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

总结:

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

到此这篇关于python魔法方法之__setattr__()的文章就介绍到这了,更多相关python魔法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一行代码生成Tableau可视化图表的方法

    一行代码生成Tableau可视化图表的方法

    本文主要介绍了一行代码生成Tableau可视化图表的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Python socket非阻塞模块应用示例

    Python socket非阻塞模块应用示例

    这篇文章主要介绍了Python socket非阻塞模块,结合实例形式分析了Python socket非阻塞模块通信相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • python 视频下载神器(you-get)的具体使用

    python 视频下载神器(you-get)的具体使用

    这篇文章主要介绍了python 视频下载神器(you-get)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 教你用Python查看茅台股票交易数据的详细代码

    教你用Python查看茅台股票交易数据的详细代码

    CSV是以逗号分隔数据项(也被称为字段)的数据交换格式,主要应用于电子表格和数据库之间的数据交换,本文给大家介绍下用Python查看茅台股票交易数据的详细代码,感兴趣的朋友一起看看吧
    2022-03-03
  • python单链路性能测试实践

    python单链路性能测试实践

    这篇文章主要为大家介绍了python单链路性能测试实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Pycharm 跳转回之前所在页面的操作

    Pycharm 跳转回之前所在页面的操作

    这篇文章主要介绍了Pycharm 跳转回之前所在页面的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • pandas对齐运算的实现示例

    pandas对齐运算的实现示例

    本文主要介绍了pandas对齐运算的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • GitHub上值得推荐的8个python 项目

    GitHub上值得推荐的8个python 项目

    GitHub 无疑是代码托管领域的先行者,Python 作为一种通用编程语言,已经被千千万万的开发人员用来构建各种有意思或有用的项目。以下我们会介绍一些使用 Python 构建的GitHub上优秀的项目。
    2020-10-10
  • 深入理解Python中__init__.py文件

    深入理解Python中__init__.py文件

    本文主要介绍了深入理解Python中__init__.py文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python游戏开发的五个案例分享

    python游戏开发的五个案例分享

    本文给大家分享了作者整理的五个python游戏开发的案例,通过具体设计思路,代码等方面详细了解python游戏开发的过程,非常的详细,希望大家能够喜欢
    2020-03-03

最新评论