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 ...
随机推荐
- 解决pycharm安装包过程出现的问题:module 'pip' has no attribute 'main'
解决pycharm安装包过程出现的问题:module 'pip' has no attribute 'main' 问题 更新pip之后,Pycharm安装package出现如下报错:module 'p ...
- mysql5.5版本和mysql 5.6版本具体有哪些区别?
mysql5.6较5.5其中有一个很大的好处,比如给表加字段的时候,5.5或以前的版本会锁表,5.6就不会锁表,而且速度很快. MySQL 5.6 对默认配置进行了一些微调,这些调整大多数都非常不错, ...
- Git 使用篇二:小组协作开发
上一片搭建了git远程服务器,那么小组成员在使用git开发的时候都有什么要注意的. 第一步: 首先每个小组成员,在自己本地建立一个目录,作为工作空间,再去git clone 这个远程仓库: git c ...
- Django模板的加深
网站模板的设计,一般的,都有一些通用的设计,有导航.底部.统计等相关代码:nav.html.bottom.html.tongji.html 在我前面Django工程的基础上建立一个base.html包 ...
- Kettle 4.2源码分析第三讲--Kettle 转换机制transformation介绍
转换机制 每个转换步骤都是ETL数据流里面的一个任务.转换步骤包括输入.处理和输出.输入步骤从外部数据源获取数据,例如文件或者数据库:处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤.输出步骤 ...
- 可视化url
http://blog.csdn.net/u011532367/article/list/1
- redhat7:用户、组和权限
用户: 任何用户被分配一个独特的用户id号(UID) (UID 0标识root用户 用户账号通常从UID 1000开始(在redhat6及之前的版本,从500开始)) . 用户名和UID信息 ...
- 协作工具 discord 和 slack
discord: https://discordapp.com/ slack: www.slack.com
- PHP 接收筛选项包含0的select下拉菜单的处理
这种情况下,PHP的判断方法如下: $where = "1=1"; if ($get['status'] !== '' && $get['status'] !== ...
- Scala中的数组和集合操作
package test /* 1.在scala集合中,Iterable是共同的Trait,Iterable要求继承者实现一些共同的方法,例如元素的遍历 * 2.Array是scala基础的数据结构, ...