提示:这篇博文参考了两个博客,第一篇博文地址为:https://www.cnblogs.com/Lambda721/p/6132206.html,另一篇博文地址如下:关于python的property

需求:一个People类,类中很简单就只年龄和名字的属性,在实例化的时候需要对年龄的数值进行判断,若在合理的范围之内则进行正常实例化,否则打印出提示信息。

先看如下的一个操作:

class People(object):
def __init__(self,name,age):
self.name = name
self.age = age def get_info(self):
print("The %s is %d years old" % (self.name, self.age))

然后做如下操作:

a = People("job", 23)  #实例化
a.get_info() #得到信息
a.name = "Swift" #更改属性的值
a.age = 1000 #对age的更改显然不符合实际需求,因为人的年龄不可能达到1000岁的,
a.get_info() #得到更改之后的信息
The job is 23 years old          #更改之前的信息
The Swift is 1000 years old #更改之后的信息

上述操作的结果

改进:在实例化的时候,希望能够对age的范围进行判断,若范围合理则进行实例化操作,否则提示用户。

class People(object):
def __init__(self,name,age):
self.name = name
self.age = age def set_age(self,age): #对age的值进行判断
if age > 0 and age < 100:
self.age = age
else:
print("the age is invalid value, Please check it!")
exit() def get_info(self):
print("The %s is %d years old" % (self.name, self.age))

上述代码改进之后,做如下操作:

>>> a = People("job", 23)       #在实例化时传入的age数值仍然不会判断是否合理
>>> a.get_info()
The job is 23 years old
>>> a.set_age(124) #修改数值时调用set_age方法则可以进行合理范围判断
>>> a.get_info()
the age is invalid value, Please check it!

分析:在使用set_age修改age值时可以对age的值进行判断,但是这样调用总是没有直接使用a.age = value的形式方便。

为了解决这个问题,python引入了property语法糖。

class People(object):
def __init__(self,name,age):
self.name = name
self.__age = age @property
def age(self):
return self.__age @age.setter
def age(self,age):
if age > 0 and age < 100:
self.__age = age
else:
print("the age is invalid value, Please check it!")
exit()

注意: 第一个age(self)是get方法,用@property装饰,第二个age(self, score)是set方法,用@age.setter装饰,@age.setter是前一个@property装饰后的副产品。

执行结果如下:

>>> a = People("Job", 23)
>>> print(a.age)
23
>>> a.age = 123 #通过age赋值,检查数值的范围是否合理
>>> print(a.age)
the age is invalid value, Please check it!

可以看到对age的调用其实在调用set方法。

在这里是把property作为语法糖使用,也可以作为property函数使用,作为函数使用的用法可以参考博文开始提高的第二篇博文中最后面的介绍!

												

python中的property的更多相关文章

  1. 关于python中的property

    python中的property在类实例化的时候 可以把类方法变成类属性使用, 还可以用在简化赋值上 1)不用property的时候,你的类可能是这样写的 2)用propery的时候你可能会这样写,调 ...

  2. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  3. python中的property属性

    目录 1. 什么是property属性 2. 简单的实例 3. property属性的有两种方式 3.1 装饰器方式 3.2 类属性方式,创建值为property对象的类属性 4. property属 ...

  4. Python中的@property装饰器

    要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,n ...

  5. python 中的property

    """ property() 的第一个参数是 getter 方法,第二个参数是 setter 方法 xx = property(a,b) @property #用于指示g ...

  6. python中的@property

    @property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 class People: def __init__(sel ...

  7. python中使用@property

    class Student(object): @property def score(self): return self._score @score.setter def score(self, v ...

  8. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  9. python中封装

    封装 引子 从封装的本身意思去理解,封装就是用一个袋子,把买的水果.书.水杯一起装进袋子里,然后再把袋子的口给封上,照这样的理解来说,封装=隐藏,但是,这种理解是片面的 ## 如何封装 在python ...

随机推荐

  1. Redis的启动过程

    本文主要介绍Redis启动加载过程,总体上可以分为如下几步: 1. 初始化全局服务器配置 2. 加载配置文件(如果指定了配置文件,否则使用默认配置) 3. 初始化服务器 4. 加载数据库 5. 网络监 ...

  2. 处理 Java Tomcat 的“Cannot allocate memory”错误

    参考:https://www.cnblogs.com/rabbitpei/p/6738671.html 启动tomcat报错如下 临时生效 echo 1 > /proc/sys/vm/overc ...

  3. Saltstack之SaltSyndic

    SaltSyndic 1,SaltSyndic必须运行在salt-master上面 2,Syndic要连接另外一个Master比它更高级 在master安装syndic yum -y install ...

  4. ZOJ 3983 - Crusaders Quest - [DFS]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给出一个长度为 $9$ 的字符串 $s$,且 $s ...

  5. rank() over,dense_rank(),row_number() 的区别

    转自:https://jingyan.baidu.com/article/597035521ff2ec8fc107404b.html rank() over是的作用是查出指定条件后进行一个排名,但是有 ...

  6. webpack初入门

    首先利用npm install webpack -g,这里我试过用cnpm安装不成功,不知道是什么回事, webpack 用来压缩打包网站的一些插件和依赖包而存在的, webpack  文件名  打包 ...

  7. MongoDB的”存储过程“

    使用 db.system.js.insert({_id:"aaa", value:"zzq"}); 这条命令向全局系统的js中添加了一个_id为"aa ...

  8. 洛谷 P4201 设计路线 [NOI2008] 树形dp

    正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...

  9. 8 jmeter之集合点

    集合点:集合点用以同步虚拟用户,以便恰好在同一时刻执行任务.在测试计划中,可能会要求系统能够承受1000 人同时提交数据,在LoadRunner 中可以通过在提交数据操作前面加入集合点,这样当虚拟用户 ...

  10. js将form表单序列化[json字符串、数组、对象]

    1.序列化为字符串 $("#Form").serialize();//name=zhangsan&sex=1&age=20   2.序列化为数组 var formD ...