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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值