Python面向对象高级编程-@property

时间:2022-09-06 17:06:39

使用@property

在绑定属性时,如果直接把属性暴露出去,虽然写起来简单,但是没法检查参数,导致可以把成绩随便改:

>>> class Student(object):
pass >>> s =Student()
>>> s.score=999
>>> s.score
999

这显然不符合逻辑,为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

>>> class Student(object):
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 >>> s = Student()
>>> s.set_score('a') Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
s.set_score('a')
File "<pyshell#54>", line 6, in set_score
raise ValueError("score must be an integer")
ValueError: score must be an integer
>>> s.set_score(99999) Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
s.set_score(99999)
File "<pyshell#54>", line 8, in set_score
raise ValueError("score must between 0~100")
ValueError: score must between 0~100
>>> s.set_score(99)
>>> s.get_score()
99
>>>

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

有没有技能检查参数,有可以用雷士属性这样简单地方式来访问类的变量?

记得装饰器(decorator)可以给函数动态加上功能?对于累的方法,装饰器一样起作用,Python内置的@property装饰器就是负责把一个方法变成属性调用的:

>>> class Student(object):

    @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 >>> s = Student()
>>> s.score =99
>>> s.score = 999 Traceback (most recent call last):
File "<pyshell#76>", line 1, in <module>
s.score = 999
File "<pyshell#73>", line 12, in score
raise ValueError('score must between 0 ~ 100!')
ValueError: score must between 0 ~ 100!
>>> s.score = 'a' Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
s.score = 'a'
File "<pyshell#73>", line 10, in score
raise ValueError('score must be an integer!')
ValueError: score must be an integer!
>>>

注意这个@property,在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

还可以定义只读属性,值定义getter方法,不定义setter方法就是一个只读属性:

>> class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self,value):
self._birth = value
@property
def age(self):
return 2017 - self._birth >>> s = Student()
>>> s.birth = 1995 >>> s.age
22
>>> s.age = 23 Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
s.age = 23
AttributeError: can't set attribute
>>>

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。

总结

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样程序运行时就减少了出错的可能性。

Python面向对象高级编程-@property的更多相关文章

  1. python面向对象高级编程

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Studen ...

  2. Python面向对象高级编程:&commat;property--把方法变为属性

    为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: >>> ...

  3. python 面向对象高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.

  4. python面向对象高级:&commat;property

    @property 把方法『变成』了属性,广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性. 最大的作用就是既能检查参数,又可以用类 ...

  5. Python面向对象高级编程-&lowbar;&lowbar;slots&lowbar;&lowbar;、定制类,枚举

    当在类体内定义好各种属性后,外部是可以随便添加属性的,Python中类如何限制实例的属性? Python自带了很多定制类,诸如__slots__,__str__ __slots__ __slots__ ...

  6. Python面向对象高级编程:&lowbar;&lowbar;slot&lowbar;&lowbar;&lpar;给实例添加方法、属性&rpar;

    纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...

  7. Python面向对象高级编程-&lowbar;slots&lowbar;

    使用_slots_ 正常情况下,当定义一个class,创建一个class的实例后,可以给实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Stu ...

  8. C&plus;&plus;面向对象高级编程&lpar;九&rpar;Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  9. C&plus;&plus;面向对象高级编程&lpar;八&rpar;模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

随机推荐

  1. C&num;获取当前程序运行路径的方法集合

    //获取当前进程的完整路径,包含文件名(进程名).string str = this.GetType().Assembly.Location;result: X:\xxx\xxx\xxx.exe (. ...

  2. echarts在&period;Net中使用实例&lpar;二&rpar; 使用ajax动态加载数据

    通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}back ...

  3. hdu4982 Goffi and Squary Partition (DFS解法)

    BestCoder Round #6 B http://acm.hdu.edu.cn/showproblem.php?pid=4982 Goffi and Squary Partition Time ...

  4. Excel操作类

    '引入Excel的COM组件 Imports System Imports System.Data Imports System.Configuration Imports System.Web Im ...

  5. jQuery中get与eq的区别

    get与eq的区别 .eq() 减少匹配元素的集合,根据index索引值,精确指定索引对象. .get() 通过检索匹配jQuery对象得到对应的DOM元素. 同样是返回元素,那么eq与get有什么区 ...

  6. jquery&period;cycle&period;js简单用法实例

    样式: a{text-decoration: none;} *{;;} /*容器设置*/ .player { width:216px; height:248px; background:url(htt ...

  7. 系统变量file&period;encoding对Java的运行影响有多大&quest;&lpar;转&rpar;good

    这个话题来自: Nutz的issue 361 在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码. 今天,我想到, 这个系统变量,对JVM的影响到底有多 ...

  8. Tensorflow搞一个聊天机器人

    catalogue . 前言 . 训练语料库 . 数据预处理 . 词汇转向量 . 训练 . 聊天机器人 - 验证效果 0. 前言 不是搞机器学习算法专业的,3个月前开始补了一些神经网络,卷积,神经网络 ...

  9. e充电加密破解

    def encrypt(self,stationId ): keys = 'F29E0E39-98E4-F4CC318443' encrypt_obj = pyDes.triple_des(keys, ...

  10. camera原理

    1)Color Filter Array---CFA 图像传感器都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式.BGR 模式是一种可直接进行显示和压缩等处理的图像数据模式,它 ...