动态属性@property 、__getattr__和__getattribute__ 、 __new__ 和 __init__、属性描述符

2024-02-21 11:38

本文主要是介绍动态属性@property 、__getattr__和__getattribute__ 、 __new__ 和 __init__、属性描述符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态属性 @property

from datetime import date, datetime
class User:def __init__(self, name, birthday):self.name = nameself.birthday = birthdayself._age = 0 # _代表这个属性不想暴露,代码上的规范。双下滑线隐藏。@property # 将age方法变为属性 、这个可以理解为get属性def age(self):# 获取他的年龄 当年年份-生日return datetime.now().year - self.birthday.year@age.setter # user.age=30 会运行这段代码def age(self, value):self._age = valueif __name__ == "__main__":user = User("bobby", date(year=1987, month=1, day=1))user.age = 30print (user._age)print(user.age)

__getattr__ ,__getattribute__

"""
__getattr__ 在查找不到属性的时候调用"""from datetime import date, datetime
class User:def __init__(self, name, birthday):self.name = nameself.birthday = birthdaydef __getattr__(self, item):# 查找不到属性的时候,进入到这里,返回# 可以查找到,不会进入到这里面# 可以写一些逻辑,比如不区分大小写return "no attr"if __name__ == "__main__":user = User("bobby", date(year=1987, month=1, day=1))print (user.age)"""
除了以上,还可以 如果类里面有 属性a = dict
我们想通过 A类 访问a(dict)里的属性 ,a = {"name"}  A.name
def __getattr__(self, item):return self.a[tiem]
"""# __getattribute__(self,item):
# 这个是访问任何属性,都会无条件进入这个。
# 这个能不重写,尽量不要碰。
# 不过写框架的时候,可能会用到。

属性描述符和属性的查找过程

"""
IntField 是专门判断是否为整数的类实现get set delte任何一个魔法函数,IntField 就变为属性描述符
"""
import numbersclass IntField:"""数据描述符"""def __get__(self,instance,owner):return self.valuedef __set__(self,instance,value):# 判断是否为Int类型if not isinstance(value,numbers.Integral):raise ValueError("int value need ")if value<0:raise ValueError("positive value need ")self.value = valuepassdef __delete__(self,instance):passclass NoneDataIntField:"""非数据属性描述符"""def __get__(self,instance,owner):return self.value class User:age = IntField()if __name__ == "__main__":user = User()user.age=30 # 赋值的时候,其实会调用User的set方法。print(user.age)
"""
属性描述符查找的完整过程
如果user是某个类的实例,那么user.age(以及等价的getattr(user,’age’)) getattr全局
首先调用__getattribute__。如果类定义了__getattr__方法
那么在__getattribute__抛出 AttributeError 的时候就会调用到__getattr__,
而对于描述符(__get__)的调用,则是发生在__getattribute__内部的。
user = User(), 那么user.age 顺序如下:(1)如果“age”是出现在User或其基类的__dict__中, 且age是data descriptor, 那么调用其__get__方法, 否则(2)如果“age”出现在user的__dict__中, 那么直接返回 obj.__dict__[‘age’], 否则(3)如果“age”出现在User或其基类的__dict__中(3.1)如果age是non-data descriptor,那么调用其__get__方法, 否则(3.2)返回 __dict__[‘age’](4)如果User有__getattr__方法,调用__getattr__方法,否则(5)抛出AttributeError"""

__new__ 和 __init__

class User:def __new__(cls,*args,**kwargs):print("in new")# 如果不返回,不会运行init,就没有name属性了return super().__new__(cls)def __init__(self,name):print("in init")self.name = name
if __name__ == "__main__":user = User("name")print(user.name)
"""
new用来控制对象的生成过程,在对象生成之前
init是用来完善对象的
如果new 不返回对象,则不会调用init方法
"""

这篇关于动态属性@property 、__getattr__和__getattribute__ 、 __new__ 和 __init__、属性描述符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处