python中的property
提示:这篇博文参考了两个博客,第一篇博文地址为: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的更多相关文章
- 关于python中的property
python中的property在类实例化的时候 可以把类方法变成类属性使用, 还可以用在简化赋值上 1)不用property的时候,你的类可能是这样写的 2)用propery的时候你可能会这样写,调 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python中的property属性
目录 1. 什么是property属性 2. 简单的实例 3. property属性的有两种方式 3.1 装饰器方式 3.2 类属性方式,创建值为property对象的类属性 4. property属 ...
- Python中的@property装饰器
要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,n ...
- python 中的property
""" property() 的第一个参数是 getter 方法,第二个参数是 setter 方法 xx = property(a,b) @property #用于指示g ...
- python中的@property
@property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 class People: def __init__(sel ...
- python中使用@property
class Student(object): @property def score(self): return self._score @score.setter def score(self, v ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- python中封装
封装 引子 从封装的本身意思去理解,封装就是用一个袋子,把买的水果.书.水杯一起装进袋子里,然后再把袋子的口给封上,照这样的理解来说,封装=隐藏,但是,这种理解是片面的 ## 如何封装 在python ...
随机推荐
- java.lang.ClassNotFoundException: hudson.remoting.Launcher
jenkins构建失败,错误信息如下: [yjp-dev-po-hrsync] $ "C:\Program Files\Java\jdk1.8.0_121/bin/java" -c ...
- 0002python中dict和list的特殊构造
>>> myinfor = {"name":"qiwsir","site":"qiwsir.github.io& ...
- C# ArcEngine TOCControl上实现右键
第一种方法:使用contextMenuStrip控件 1.新建一个窗体AttributeTable,并定义一个全局变量mLayer,让主窗体里面的axMapControl1的layer传进来,从而获取 ...
- 异步IO
异步IO 在IO编程一节中,我们已经知道,CPU的速度远远快于磁盘.网络等IO.在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件.发送网络数据时,就需要等待IO操作完成, ...
- 菜鸟教程之工具使用——Git的基本使用
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/liushuijinger/article/details/37569907 Git是进来比較火的版本 ...
- 11 jmeter之图形监控扩展
Jmeter默认监听器的缺陷 Jmeter默认的监听器在表格.文字方面比较健全,但是在图形监控方面比较逊色,尤其在监控Windows或Linux的系统资源方面.但是jmeter作为一款开源工具,允许通 ...
- storm并发机制,通信机制,任务提交
一.storm的并发 (1)Workers(JVMs):在一个物理节点上可以运行一个或多个独立的JVM进程.一个Topology可以包含一个或多个worker(并行的跑在不同的物理机上),所以work ...
- 申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置
什么是 Let’s Encrypt? 部署 HTTPS 网站的时候需要证书,证书由 CA (Certificate Authority )机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于 ...
- [LeetCode] 292. Nim Game_Easy tag: Math
You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...
- Linux sendmail
最近在写自动化巡检脚本,想着怎么预警后自动发送邮件报警. 首先下载最新版本mailx-12.4.tar.bz2 # wget http://sourceforge.net/projects/heirl ...