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

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods