Python __getattr__ __getattribute__ __setattr__

2024-05-28 00:58

本文主要是介绍Python __getattr__ __getattribute__ __setattr__,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

__getattr__

如果某类定义了__getattr__,同时系统在该类对象的实例字典中又找不到待查询的属性,系统就会调用这个方法,这种行为非常适合无结构数据的按需访问。

class A:def __init__(self):self.name = 'Tom'def __getattr__(self,name):setattr(self, name, name)return "can not find %s attr" %name
>>> a = A()
>>> a.name									# name属性本身在实例字典里,所以绝对不会触发__getattr__
'Tom'
>>> a.age									# age 会触发__getattr__,又调用setattr方法放入属性字典
'can not find age attr'
>>> 
>>> a = A()
>>> a.__dict__
{'name': 'Tom'}
>>> a.name
'Tom'
>>> a.age
'can not find age attr'
>>> a.__dict__
{'name': 'Tom', 'age': 'age'}

__getattribute__

程序每次访问对象属性时,Python系统都会调用这个特殊的方法,即使属性字典里面已经有了改属性,也依然会触发__getattribute__。

class B(object):def __init__(self):self.name = 'Frank'def __getattribute__(self, name):print('Called __getattribute__(%s)' % name)try:return super().__getattribute__(name)except AttributeError:setattr(self, name, name)return "can not find %s attr" %name
>>> b = B()
>>> b.name
Called __getattribute__(name)
'Frank'
>>> b.age
Called __getattribute__(age)
'can not find age attr'
>>> b.age
Called __getattribute__(age)
'age'
如果类还定义了__getattr__方法,除非__getattribute__调用它或者出现AttributeError错误,否则__getattr__方法不会被调用。
class B(object):def __init__(self):self.name = 'Frank'def __getattribute__(self, name):print('Called __getattribute__(%s)' % name)super().__getattribute__(name)def __getattr__(self, name):print('Called __getattr__(%s)' % name)
>>> b = B()
>>> b.a
Called __getattribute__(a)
Called __getattr__(a)
__getattribute__方法下应该避免使用self.attr访问属性,否则会出现无限递归。如要要访问实例属性,应该直接通过super()来做。
class B(object):def __init__(self):self.name = 'Frank'def __getattribute__(self, name):
#        return self.__dict__['name']				#导致无限递归return super().__getattribute__(name)		#正常
>>> b = B()
>>> b.name


__setattr__ 
只要对实例属性赋值,无论是直接赋值,还是通过内置的setattr赋值,都会触发__setattr__方法。__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。一般情况都还是继承

class C:def __setattr__(self, name, value):print('Called __setattr__(%s, %r)' % (name, value))super().__setattr__(name, value)
>>> c = C()
>>> c.a = 1
Called __setattr__(a, 1)
>>> c.a
1
>>> c.b = 2
Called __setattr__(b, 2)
>>> setattr(c,'d',2)
>>> c.__dict__
{'a': 1, 'd': 2, 'b': 2}
hasattr函数来判断对象是否拥有相关的属性,并用内置的getattr函数来获取属性值。这些函数会先在实例字典中搜索待查询的属性。然后再调用__getattr__

这篇关于Python __getattr__ __getattribute__ __setattr__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009096

相关文章

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2