python property setter_Python:动态属性 property setter 以及 __getattr__ 属性

1. property

引言:

-- 假设有这样一个需求,我们需要创建一个 User 类,并初始化 birthday 参数,之后根据 birthday 计算得到年龄;

-- 我们设计下面的代码实现该需求:

>>> from datetime import date, datetime

>>>

>>>

>>> class User():

... def __init__(self, nbirthday):

... self.birthday = birthday

... def get_age(self):

... return datetime.now().year - self.birthday.year

...

>>>

>>> user = User(date(year=1990, month=3, day=5))

>>> age = user.get_age()

>>> print(age)

30

-- 上面的代码中使用 user 实例调用 get_age() 方法获取 age,但是这种方法并不是常规方法,我们习惯用类似于 user.age 这样的方式获取 age;

property

-- 于是我们引入 property 属性,将 age() 方法变为实例的一个 age 属性,这样就可以通过 user.age 直接调用,代码如下:

>>> from datetime import date, datetime

>>>

>>>

>>> class User():

... def __init__(self, birthday):

... self.birthday = birthday

... @property

... def age(self):

... return datetime.now().year - self.birthday.year

...

>>>

>>> user = User(date(year=1990, month=3, day=5))

>>> print(user.age)

30

2. setter

引言

-- 假设有这样一个需求,我们需要创建一个 User 类,初始化属性 age 默认为 0,之后改变 age 的值,并获取该值;

-- 我们设计下面的代码实现该需求:

>>> class User():

... def __init__(self):

... self.age = 0

... def set_age(self, age):

... self.age = age

...

>>>

>>> user = User("zhang")

>>> user.set_age(30)

>>> print(user.age)

30

-- 上面的代码中使用 user 实例调用 set_age() 方法赋值于 age,但是这种方法并不是常规方法,我们习惯用类似于 user.age = xxx 这样的方式赋值 age;

setter

-- 于是我们引入 setter 属性,这样就可以通过 user.age 直接赋值,代码如下:

>>> class User():

... def __init__(self,):

... self._age = 0

... @ property

... def age(self):

... return self._age

... @age.setter

... def age(self, age_value):

... self._age = age_value

...

>>>

>>> user = User()

>>> user.age = 30

>>> print(user.age)

30

3. __ getattr __

引言

-- 在开发过程中,我们经常需要设计并获取类的实例对象的属性,但有时会因为疏忽遗漏没有为类设计某个属性,这就导致获取属性值的实收出现报错,故而造成程序异常甚至崩溃;

-- 如下面的代码:

>>> class User():

... def __init__(self, name):

... self.name = name

...

>>>

>>> user = User(name="zhangsan")

>>> print(user.age)

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'User' object has no attribute 'age'

__ getattr __ 处理 object has no attribute 报错

-- 如上面的代码,User 类并没有 age 属性,所以在实例 user 获取 age 属性时遇到报错,这个时候需要用到 __ getattr __ 解决此问题;

>>> class User():

... def __init__(self, name):

... self.name = name

... def __getattr__(self, item): # 注意:此处 item 不能少

... pass

...

>>>

>>> user = User(name="zhangsan")

>>> print(user.age)

None

-- 在上面的代码中,User 类并没有 age 属性,所以在实例 user 获取 age 属性时并未报错,而只是反悔了一个 None,这就有效避免了报错;

__ getattr __ 获取 dict 类型属性的 value 值

-- 除了上面的用法,__ getattr __ 还可以用来更好的获取 dict 类型属性的 value 值;

-- 比如我们初始化类时给与其一个 dict 字典属性参数,我们希望可以通过 实例. 属性(比如 user.age)的方式直接获取 dict 字典中 key 为 age 的 value 值;

-- 以下面的代码为例:

>>> class User():

... def __init__(self, info={}):

... self.info = info

... def __getattr__(self, item):

... if not item in self.info.keys():

... return None

... return self.info[item]

...

>>>

>>> user = User({"name":"zhangsan", "age":23})

>>> print(user.age)

23

>>> print(user.gender)

None

-- 代码中 user.age 的方式直接获取初始化参数 dict 字典中 key 为 age 的 value 值 23,同时 dict 中并未有 key 为 gender 的键值对,user.gender 直接返回 None 而并未出现报错;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习三部曲

随着科技的发展,计算机对人类的生产活动和社会活动产生了极为重要的影响,同时以强大的生命力飞速发展着。目前计算机正广泛用于社会各个领域,并朝着微型化、网络化、智能化和巨型化的方向前进。说到智能化,大家最先想到的应该就是…

AntDesign Pro + .NET Core 实现基于JWT的登录认证

很多同学说AgileConfig的UI实在是太丑了。我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据。后来加上了UI也是使用了老掉牙的bootstrap3做为基础样式。前台框架也是使用了angularjs,同…

武汉大学计算机学院2019考研复试,2019年武汉大学硕士研究生复试及录取名单汇总...

原标题:2019年武汉大学硕士研究生复试及录取名单汇总考生可以通过录取名单了解到很多重要的信息,例如复试比例,进复试最低分,复试录取成绩,录取总评成绩等重要信息。以下是我们整理收集到的各学院复试录取名单汇总&…

ugui unity 取消选择_UGUI中几种不规则按钮的实现方式

前言UGUI中的按钮默认是矩形的,若要实现非矩形按钮该怎么做呢?比如这样的按钮:本文将介绍两种实现方式供大家选择。使用alphaHitTestMinimumThresholdImage类的alphaHitTestMinimumThreshold是一个浮点值,Raycast检测时只有图片中…

你的专业 VS 你妈口中你的专业

亲妈认证★英语语言文学我妈:她就是一个学英语的~我同学:你学英语的啊?那你看美剧不用看字幕的吧?你听英文歌都听得懂的吧?这个怎么翻译啊?这上面写的什么?你不是专八吗?哈喽~ 在吗&…

反射 + 抽象工厂模式切换不同的实现方法

概述工厂模式(Abstract Factory)定义 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其…

计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算

2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。引言运算一直是程序运行当中一个重要的环节,而在二进制的运算过程当中&#xff…

3 年工作经验程序员应有的技能

前言因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的。第二阶段:五年五…

应急响应中的溯源方法

在发现有入侵者后,快速由守转攻,进行精准地溯源反制,收集攻击路径和攻击者身份信息,勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源:确认攻击者的行为 ,分析日志 数据包等; 对外溯源&…

POP3口令扫描案例

通过本案例可以学到: (1)了解POP3有关知识(2)利用Hscan工具软件来破解POP3账号和口令现在很多邮箱服务器都支持POP3功能,通过POP3来收取信件,收取信件时仅仅需要提供用户名和密码。目前有很多工具可以扫描POP3邮件账号和口令,本案…

中connect怎么用_烘焙中的各种酒,到底该怎么用?

​在烘焙食谱中,经常会出现“酒”这样材料。烘焙中的酒,仿佛是个神秘的存在,品种也繁多得让人一脸懵逼,朗姆酒是干嘛用的?怎么还有分白朗姆和金朗姆?和利口酒有什么区别?利口酒和力娇酒是同一个…

QQ旋风爆缓冲区溢出漏洞

据金山毒霸安全实验室5月7日透露,金山毒霸安全实验室研究人员进行例行漏洞检查过程中,发现QQ旋风存在一鲜为人知的缓冲区溢出0day漏洞,***者可以利用该漏洞制造恶意URL,使用IE6,7内核的各种浏览器均会受此漏洞的影响。…

w10计算机无法打印,win10升级后惠普无法打印怎么解决_win10升级后惠普打印不了的处理办法...

使用电脑工作或学习时,我们经常会需要用到打印机。可是最近有一些网友却反映说,自己的win10电脑在升级后出现了惠普无法打印的情况,这是怎么一回事呢?我们又该怎么解决呢?用户不是很清楚,所以对此今天本文为…

女神节爆猛料!. NET程序员男女比例公布!

今天是三八女神节,这里先祝广大的程序员妹子们节日快乐,健康美丽!有一个问题,相信很多.NET程序员都很感兴趣:.NET程序员中女生占比多少?先来公布答案:在本次调查中发现,.NET程序员群…

金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全

上一期给宝宝们更新了金蝶软件建账的一些处理流程,宝宝们已经迫不及待要求后续了。在日常处理部分主要是以下几个方面一、凭证审核1.凭证录入点击主窗口中的【凭证】,单击【凭证】录入在凭证录入窗口中单击【凭证录入】按钮,在这个窗口中就可…

在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统,使用十分广泛。在一些数据量不大的应用程序中,如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单,只要找一个C#的wrapper就可以了,例如,我使用的就是来自…

BI 界震动 - Power BI Premium 个人版只要每月 120 元

大事来了就在今天,微软宣布:Power BI Premium Per User 定价:每月 120 元人民币。我只能说:他没有骗人。Power BI 团队也在这个战略决策上符合了微软的核心使命。这一举措将更加彻底的巩固微软 Power BI 的商业智能帝国地位&#…

西北工业大学计算机毕业论文,光纤通信发射机本科毕业论文 西北工业大学.docx...

光纤通信发射机本科毕业论文 西北工业大学本科毕业设计论文 PAGE 41摘 要 直接调制光发射机能完成对电信号的处理,其功能是把电脉冲信号变成光脉冲信号。本文先介绍了光纤通信的发展背景,光纤相对于传统铜导线的优越性,以及光纤通信未来的发展…

用 Python 实现一个大数据搜索引擎

搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理。布隆过滤器 (Bloom Filter)第一步我们先要实现一个布隆…

kuayu react_React+Spring实现跨域问题的完美解决方法

最近小编在学习react,在学习过程中遇到ReactSpring实现跨域问题,下面小编记录了整个问题过程,给大家做个参考。react 跨域访问后台,默认是有跨域问题,并且火弧和谷歌浏览器,对跨域问题展示还不一样.谷歌浏览…