python里关于解释器property的一些个人理解
python里关于解释器property的一些个人理解
-------题目小尾巴:各种方式的转载请标明出处哈,出事概不负责哦!!来自2020/11/22
0.0 虽然好像这种东西怎么会出事,不过我打字确实也很累的。。。
这是我人生中第一次写博客
本次写博客的目的是 记录平时自己学到的东西,一个笔录,如果错误,希望大家可以指正;当然若是能帮助到人就再好不过了 。之后的每个自创博客都会有以下东西表明记录时的情况 ↓
标记文本
下面开始进入
正文
一般,写代码时,想把类中的方法变成一个可直接调用的属性的时候,可以用@property加在想可以直接调用的方法上(我在写测试机器人脚本的时候查的装饰器)
简单来说,想调用(自己写的)类变为实例的时候,对这个类里的方法可以简单的调用,那么可以在这个类中方法上用@property。
例子1(没编译过,看得懂就好)
class Job(object):
def get_graduates(self):
return self._graduates
def set_graduates(self, value):
if not isinstance(value, int):
raise ValueError('years must be an integer!')
if value < 0 or value >9999:
raise ValueError('years must between 0~9999!')
self._graduates = value
上面的代码很容易知道是,编写了一个job类,类中有一个graduates(应届生年份)方法,因为按照目前的2020年来说,要到公元前或者公元后10000年拿到一个应届生的简历基本不可能(那时候可能不需要这样编程了吧),所以我们给传入的参数两个限制,①是整数,②是在0~9999年之间的年份都可以。
按照上面的类,如果要创建一个实例,可以是下面这样:
>>>s=Job()
>>>s.set_graduates(2016) #ok!通过set_graduates()的数字才能赋值给self._years
>>>s.get_graduates()
2016
这样才成功输出s的应届生年份是2016。可以看到,这样创建实例,调用方法时很麻烦,那如果我们运用了@property呢?
例子2
class Job(object):
@property
def graduates(self):
return self._graduates
@graduates.setter
def graduates(self, value):
if not isinstance(value, int):
raise ValueError('years must be an integer!')
if value < 0 or value > 9999:
raise ValueError('years must between 0~9999!')
self._graduates = value
这样创建实例,调用方法就可以像下面这样简单:
>>>s = Job()
>>>s.graduates = 2016 #实际上这里转成了s.set_graduates(2016)
>>>s.graduates #实际上这里转成了s.get_graduates()
2016
这里可以看到很简单把2016这个参数传进去了。我们在下面解释以下这个解释器property。是按照我自己通俗的话来写的:
问题一:装饰器property的作用是什么?
答:目的是让调用者写出简短的代码,一般广泛用于类的定义中,同时它可以保证对参数进行必要的检查,减少
程序运行时候的错误。这里扩展一下:检查错误的方法中,我们原先是用的set_graduates()写的一个方法,当
使用了property的装饰器后,系统本身会自动有这个方法的setter和getter,前者是用来装饰检测参数的(类似我
们上面写的);而后者表示为只读(意思就是:只要创建了实例,调用到了这个实例内的这个方法,编译器就自己
给出来了。)后者的用法是 只写@property,下面是廖雪峰老师的例子:
class Student(object):
@property
def birth(self): #birth方法在下面用了setter,那么birth即是一个可控的属性
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property #age方法只用了property,没有使用setter,即是一个只读属性
def age(self):
return 2020 - self._birth
注意:这里,调用者在实例中调用age时,一定要前面已经给实例传入了birth参数,这样age才能计算出来。
还有:这里例子中的setter没有对参数进行检查,并不代表是错的,装饰器property本身只是负责把一个方法变成属性,即调用者在写实例的时候方便读写其中的属性。只不过,我们经常用装饰器property对参数进行检查。
问题二:isinstance()的用法?(和本题目无关,只是自己记录用)
答:isinstance(object, classinfo)
object表示 需要检测的物体 ,可以是参数(任何参数);classinfo表示 对照的对象,即类型。
这里有个疑问,object可以是函数吗?如果有大佬看到,欢迎回答。
问题三:raise的用法(和本题目无关)
答:(根据前面代码)如果不满足条件,会在系统就会输出我们常见的**Error,只不过这里是我们设定输出的
Error信息。
感谢观看,如果有不正确的地方,欢迎指出,共同进步!本来我以为这点东西可以很快写完的,没想到啊!!!语言还需要精炼点!!