欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python里关于解释器property的一些个人理解

程序员文章站 2022-07-14 08:56:33
...

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信息。

感谢观看,如果有不正确的地方,欢迎指出,共同进步!本来我以为这点东西可以很快写完的,没想到啊!!!语言还需要精炼点!!