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的urllib模块显示下载进度示例
Jan 17 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
Mar 02 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
Keras设置以及获取权重的实现
Jun 19 Python
pytorch简介
Nov 11 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 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编程注意事项的小结
2013/04/27 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
Vue程序调试的方法
2019/06/17 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
Python datetime 如何处理时区信息
2020/09/02 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
大学生旷课检讨书
2014/01/22 职场文书
摄影助理岗位职责
2014/02/07 职场文书
党员组织关系介绍信
2014/02/13 职场文书
《童趣》教学反思
2014/02/19 职场文书
新年联欢会主持词
2014/03/27 职场文书
清明节寄语2015
2015/03/23 职场文书
保外就医申请书范文
2015/08/06 职场文书
Python实现归一化算法详情
2022/03/18 Python
配置Kubernetes外网访问集群
2022/03/31 Servers