动态属性@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

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET