点击上方“Go语言进阶学习”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

不堪玄鬓影,来对白头吟。

一、使用@property优点

将类方法转换为类属性,可以用来直接获取属性值或者对属性进行赋值。

案例分析

例:

class Exam(object):def __init__(self, score):self._score = scoredef get_score(self):return self._scoredef set_score(self, val):if val < 0:self._score = 0elif val > 100:self._score = 100else:self._score = vale = Exam(60)
print(e.get_score())e.set_score(70)
print(e.get_score())

代码解析:

定义了一个 Exam 类,为了避免直接对 _score 属性操作,提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,可以检查参数的合理性等。

Python 提供了 property 装饰器,被装饰的方法,可以将其『当作』属性来用。

例 :

class Exam(object):def __init__(self, score):self._score = score@propertydef score(self):return self._score@score.setterdef score(self, val):if val < 0:self._score = 0elif val > 100:self._score = 100else:self._score = vale = Exam(60)
print(e.score)e.score = 90
print(e.score)e.score = 200
print(e.score)

注:

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

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

class Exam(object):def __init__(self, score):self._score = score@propertydef score(self):return self._scoree = Exam(60)
print(e.score)
e.score = 200  # score 是只读属性,不能设置值
print(e.score)

二、@property的力量

python处理上述问题的方法是使用property。可以这样来实现它。

例 :

class Celsius:def __init__(self, temperature = 0):self.temperature = temperaturedef to_fahrenheit(self):return (self.temperature * 1.8) + 32def get_temperature(self):print("获得的值")return self._temperaturedef set_temperature(self, value):if value < -273:raise ValueError("零下273度是不可能的")print("设定值")self._temperature = valuetemperature = property(get_temperature,set_temperature)

并且,一旦运行,在shell中发出以下代码。

c = Celsius()
print(c.temperature)

创建对象时,将调用init ()方法。此方法的线为self.temperature = temperature。

此分配自动称为set_temperature()。

2. 属性的作用。

任何访问如c.temperature都会自动调用get_temperature()。

例:

c.temperature = 37
print(c.temperature)
print(c.to_fahrenheit())

注:

温度值存储在私有变量_temperature中。temperature属性是一个属性对象,它提供了与此私有变量的接口。

三、深入了解property

在Python中,property()是一个内置函数,用于创建并返回属性对象。

语法

property(fget=None, fset=None, fdel=None, doc=None)

参数解析

fget为获取属性值的函数,fset为设置属性值的函数,fdel为删除属性的函数,doc为字符串(如注释)。从实现中可以看出,这些函数参数是可选的。

可以简单地按照以下方式创建属性对象。

property(fget=None, fset=None, fdel=None, doc=None)
print(property())

1. 属性对象有三个方法,getter()、setter()和deleter()。

语法:

temperature = property(get_temperature,set_temperature)

用于稍后指定fget、fset和fdel。

# 创建空属性
temperature = property()
# 设置 fget
temperature = temperature.getter(get_temperature)
# 设置 fset
temperature = temperature.setter(set_temperature)

注:

这两段代码是等效的。

不定义名称get_temperature,set_temperature。

因为它们是不必要的,并且会影响类命名空间。为此,在定义getter和setter函数时重用了名称temperature。

2. 案例

例:

class Celsius:def __init__(self, temperature = 0):self._temperature = temperaturedef to_fahrenheit(self):return (self.temperature * 1.8) + 32@propertydef temperature(self):print("获得值")return self._temperature@temperature.setterdef temperature(self, value):if value < -273:raise ValueError("零下273度是不可能的")print("零下273度是不可能的")self._temperature = value
c=Celsius()
c.temperature = 37
print(c.temperature)

注:

实现是制作属性的简单方法和推荐方法。在Python中寻找属性时,很可能会遇到这些类型的构造。

四、总结

本文基于Python基础,介绍了@property 如何把方法变成了属性。通过案例的分析,代码的展示。介绍了@property的力量,以及提供了相应错误的解决方案处理方法。属性的作用。

欢迎大家积极尝试,有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

代码很简单,希望对你学习有帮助。

------------------- End -------------------

往期精彩文章推荐:

  • 盘点Python基础之字典的那些事儿

  • 捋一捋Go语言的一个类型转换工具包strconv包

  • 一篇文章带你搞定Go语言中flag包使用

浅析Python装饰器中的@property相关推荐

  1. python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式

    漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变. 我以前也看过很 ...

  2. Python装饰器中@wraps作用

    装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等. @wraps(view_func)的作用: 不改变使用装饰器原有函数的结构(如name, doc) 1.不使用@wraps ...

  3. python 装饰器中的@wraps

    就是将 被修饰的函数(wrapped) 的一些属性值赋值给 修饰器函数(wrapper) ,最终让属性的显示更符合我们的直觉. 详细的解释为 https://segmentfault.com/a/11 ...

  4. python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~

    了解装饰器之前, 可以先了解一下什么是闭包的概念为好: 闭包, 是指在一个函数中定义了一个另外一个函数,内函数里运用了外函数的临时变量(实际参数也是临时变量),并且外函数的返回值是内函数的引用(一切皆 ...

  5. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  6. python装饰器实例-基于Python 装饰器装饰类中的方法实例

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  7. python装饰器原理-python 中的装饰器及其原理

    装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...

  8. python装饰器原理wraps(method)(self)_python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变...

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  9. python装饰器的顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

最新文章

  1. JS报“Uncaught TypeError: undefined is not a function ”异常
  2. [Node] 重要外部模块
  3. Day 09 学校应该鼓励学生做社区服务吗
  4. mysql in sql注入_在 SQL 注入攻击中检查数据库
  5. Apache Kafka-事务消息的支持与实现(本地事务)
  6. MyEclipse中导入Spring 4.0源码
  7. python子进程关闭fd_python – 捕获崩溃的子进程的“分段错误”...
  8. 前端学习(3267):js中this的指向二
  9. QQuickRenderControl
  10. 分割字符串,字符串去除空格
  11. 使用Navicat为数据库表建立触发器
  12. R语言初学者指南pdf
  13. kuangbin线段树专题
  14. nginx集群部署,实现负载均衡和nfs共享
  15. efs+pro+for+三星android设备,【极光ROM】-【三星S8/S8+ G9550/G9500】-【V30.0 Android-PIE-TL2】...
  16. 算法练习——(10)小明的作业详解与分析(栈,数组,遍历,逻辑练习)
  17. 解决Maven报错:Could not transfer artifact xxx
  18. 企业管理信息系统成功实施的四个阶段
  19. 如何在CSS中解决长英文单词的页面显示问题?CSS3
  20. 海康威视SDK告警上传功能整合到springboot(一)

热门文章

  1. 关于SharpDevelop代码分析的文章
  2. Photoshop: Best Practices for Collaboration Photoshop教程之养成有利于多人合作的PS使用习惯 Lynda课程中文字幕
  3. 城市道路监控系统存储方案
  4. --whole-archive 和 --no-whole-archive的区别
  5. 在网吧如何避开还原精灵保存文件
  6. 我的世界逆时空服务器怎么注册密码,我的世界逆时空服务器1.8-1.10
  7. 最全最通俗易懂的设计模式全集
  8. axi ps读写pl_Xilinx SDK 初学之——PS对PL寄存器的读写控制
  9. 网友才高八斗 译出奥巴马胜选演说文言版
  10. 帆软设计器安装自定义字体