Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下。

先看一个简单的例子。创建一个 Student 类,我希望通过实例来获取每个学生的一些情况,包括名字,成绩等。成绩只有等到考试结束以后才会有,所以实例化的时候不会给它赋值。

class Student:

def __init__(self, name):

self.name = name

self.score = None

mike = Student('mike')

考试完以后,准备给 mike 打分:

mike.score = 999

在这里,老师一不小心多打了个 9 ,通常来说打分都是 100 分值,999 是一个非法数据,不应该赋值成功。学生一多,老师打分出现手误的情况肯定会越来越多,所以我们必须想办法修改程序,限制 score 的值必须在 0-100 分。

限制值

我们定义一个方法,如果输入的不是 0-100 的整数,就让程序报错,数据合法,我们就把 score 属性修改成功。

def set_score(self, new_score):

if not isinstance(new_score, int):

raise ValueError('score must be int')

if 0 <= new_score <= 100:

self.score = new_score

return self.score

else:

raise ValueError('score invalid')

这样我们每次需要获取成绩的时候使用 self.score 获取,修改成绩的时候调用函数来修改:

mike.set_score(999)

调用以后会报错,因为 999 是非法数据。注意,这个时候我使用 self.score 还是可以进行设置,而且不报错:

self.score = 999

这显然是不行的。所以我们要提供一种机制,把 score 变成私有属性,不能让外部访问。很遗憾,python 的私有属性是伪私有。通常我们把 _ 开头的属性叫私有属性,但是这只是一种协议和规定,你看到下划线开头的属性,不要去访问了。你硬要访问,是可以的,python 并不会禁止。

使用 @property 的方式代替。

上面的方法虽然实现了功能,但是改变了属性的使用方式。平常是这样使用的:

# 获取属性

a = mike.score

# 设置属性

mike.score = 99

@property

def score(self):

return self._score

@score.setter

def score(self, new_score):

if not isinstance(new_score, int):

raise ValueError('score must be int')

if 0 <= new_score <= 100:

self._score = new_score

return self._score

else:

raise ValueError('score invalid')

动态属性的好处

统一了调用方式。self.score = 99 的方式,而不是函数调用的方式。

_score 我们就不直接去使用了。你要用也可以,不建议。

如果我们一个属性只可以读,把 setter 部分注释掉就可以了。

现在我们来完善这个类,添加 birth 属性和年龄属性:

from datetime import datetime

class Student:

def __init__(self, name, birth=1920):

self.name = name

self._score = None

self.birth = birth

self.age = datetime.now().year - self.birth

mike = Student('mike')

print(mike.birth)

print(mike.age)

birth 和 age 这两个是可以根据一个求出另外一个的。存在数据冗余问题。

age 属性这样是有问题的。mike 初始化的时候,age 已经被求出来了,如果我在下一年再去访问 age 属性,那他就是个错误的值。可以通过把 age 设成现在的秒数来验证:

self.age = datetime.now().second

mike = Student('mike')

time.sleep(5)

print(mike.age)

print(datetime.now().second)

动态显示

@property

def age(self):

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

注意,这里不要去设置 @age.setter ,因为他是动态变化的,你修改了会造成数据不一致,它只能作为一个只读属性。

@property 作用和应用场景:

@property 优化了属性读取和设置的可读性

需要限制属性的特征;

只读属性。如果属性只可以读,不可以写,用起来很方便。

这个属性根据一个变化的环境动态改变。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python进阶之@property动态属性的实现

本文地址: http://www.cppcns.com/jiaoben/python/255727.html

python动态属性_Python进阶之@property动态属性的实现相关推荐

  1. python中ttk详解_Python 中的Property 动态属性和特性详解

    在Python开发时,考虑到安全性,我们会通过使用 '__' 定义私有属性,以限制类外或者子类都不能直接进行访问.操作.但同时,这些私有属性并不是一成不变的,所以我们还需要提供私有属性的对外操作方式. ...

  2. 列表推导式 python原理_Python进阶-列表推导式详解总结

    列表推导式并不是什么特别的技术,它只是一种创建列表的简洁方法,目的是为了让大家写程序时更方便更快捷,写出更简洁的代码 初识列表 现在请创建一个list,元素为1到9的整数,先用普通方法做 lst = ...

  3. 上海python学徒_Python进阶路径-从学徒到大师

    了解(更深入地)关于内存管理的Python数据类型及其作用 正如社区中的一些人所知道的,我教授Python课程,其中最受欢迎的课程是综合性的Intro + Intermediate课程以及介绍各种应用 ...

  4. 元类编程--property动态属性

    from datetime import date, datetime class User:def __init__(self, name, birthday):self.name = namese ...

  5. 学会python爬虫能发财么_python如何赚钱? python爬虫如何进阶? python就业? 如何快速入门python?...

    1.如何快速入门 Python ? 我之前给大家说过,速成一门技能是不可能的,你需要花很多时间才能真正的掌握一门技能,但是快速入门是有可能的,而且也是必要的,你需要掌握最少且最必要的知识点,先进门再说 ...

  6. Python之面向对象进阶

    Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...

  7. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

  8. 浅析Python装饰器中的@property

    点击上方"Go语言进阶学习",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 不堪玄鬓影,来对白头吟. 一.使用@prop ...

  9. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

最新文章

  1. nodejs 各种插件
  2. 利用vgg预训练模型提取图像特征
  3. 不得不爱,Visual Studio Code十大超酷特性
  4. 6、WHERE:条件查询数据
  5. C# 计算IP段之间的IP列表
  6. 太好了,一分钟带你分清Python的模块、库、包有什么联系和区别?
  7. [转载] python基础入门二
  8. 无向图的邻接表表示法 及 深搜遍历DFS
  9. 计算机一级操作题题库在线,全国计算机一级操作题「题库」
  10. unity读取Json文件
  11. 【牛客网刷题】通信-华为公司专项练习
  12. au cs6七线阁教程 笔记
  13. C语言计算大写字母的个数
  14. vuejs 配置路由
  15. 机器学习_吴恩达-总
  16. Zego SDK深度适配安卓机型,实现超低延迟耳返
  17. keystore生成证书实例
  18. 网卡驱动程序框架和编写
  19. JDK -- 网络编程(TCP/UDP)
  20. python冰雹猜想_洛谷-P5727 【深基5.例3】冰雹猜想

热门文章

  1. Codeforces Round #494 (Div. 3) D. Coins and Queries(贪心
  2. 权限问题导致无法删除ftp文件
  3. 11,一道关于栈内存分配的题目
  4. autolayout中 top layout guide详解
  5. 顺序查找、折半查找及索引顺序查找
  6. LINUX 添加xp虚拟机
  7. Oracle 数据库升级
  8. 数据库系统原理简答题、论述题、判断题
  9. Linux下开源邮件系统Postfix+Extmail+Extman环境部署
  10. Spring中使用id和name的区别。