python @propert装饰器使用方法原理解析


Posted in Python onDecember 25, 2019

这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问。propert可以有两种用法:可以把一个方法变成只读属性;可以对一些属性进行过滤。

想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会报错,为了避免这种情况,可以有两种方法解决。

一:设置一个方法,对属性值进行判断:

class Student():

  def get_score(self):
    return self._score

  def set_score(self, value):
    if not isinstance(value, int):
      raise ValueError('score must be an integer!')
    if value < 0 or value > 100:
      raise ValueError('score must between 0 ~ 100!')
    self._score = value
if __name__ == '__main__':  s = Student()  s.set_score(value="88")  print(s.get_score())

再Student类中,为了避免直接对 _score 属性操作,我们提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,我们可以检查参数的合理性等。这样做没什么问题,但是我们有更简单的方式来做这件事。

二:使用propert装饰器。

class Teacher():
  @property
  def score(self):
    return self._score

  @score.setter
  def score(self, value):
    if not isinstance(value, int):
      raise ValueError('score must be an integer!')
    if value < 0 or value > 100:
      raise ValueError('score must between 0 ~ 100!')
    self._score = value
if __name__ == '__main__':

  t = Teacher()
  t.score = 10
  print(t.score)
  t.score = 20
  print(t.score)

在上面,我们给方法 score 加上了 @property,于是我们可以把 score 当成一个属性来用,此时,又会创建一个新的装饰器 score.setter,它可以把被装饰的方法变成属性来赋值。

另外,我们也不一定要使用 score.setter 这个装饰器,这时 score 就变成一个只读属性了:

class test():
  def __init__(self, s1):
    self.s = s1

  @property
  def f1(self):
    return self.s

if __name__ == '__main__':

  t1 = test(s1=90)
  print(t1.f1)

注意:最后面一行的print(t1.f1)不要加括号,print(t1.f1()),要不会报错'int' object is not callable

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

Python 相关文章推荐
Python中dictionary items()系列函数的用法实例
Aug 21 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
Python发展简史 Python来历
May 14 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
Golang GBK转UTF-8的例子
Aug 26 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
Python如何实现定时器功能
May 28 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python 消除 futureWarning问题的解决
Dec 25 #Python
提升python处理速度原理及方法实例
Dec 25 #Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 #Python
将python包发布到PyPI和制作whl文件方式
Dec 25 #Python
python几种常用功能实现代码实例
Dec 25 #Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 #Python
python 实现list或string按指定分段
Dec 25 #Python
You might like
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
Prototype使用指南之hash.js
2007/01/10 Javascript
Opacity.js
2007/01/22 Javascript
页面中js执行顺序
2009/11/09 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
python中list常用操作实例详解
2015/06/03 Python
Flask框架的学习指南之用户登录管理
2016/11/20 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python中的闭包函数
2018/02/09 Python
python:print格式化输出到文件的实例
2018/05/14 Python
python3.6实现学生信息管理系统
2019/02/21 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
python包的导入方式总结
2021/03/02 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
中科前程Java笔试题
2016/11/20 面试题
大学生个人简历自我评价
2015/03/11 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers