Python编程:@property详解

在前面学习一文中,我们设计了一个SmartPhone类:

如果你观察的足够仔细,你会发现,例子中我们属性只有3个,增加了3对方法,也就是6个方法。我们已经知道,当把属性设置为私有属性时,通过添加对应的方法获取其值,通过添加对应的方法设置值,还可以通过方法做数据的有效性校验、过滤等操作。

那么,如果属性非常多时,我们上面的做法又会显得非常麻烦,这有没有好的解决方案呢?答案是有的。python中给我们提供了一些关键词,专门帮我们解决上面的问题,我们今天就详细学习这些知识。

@property

@property是Python内置的一种装饰器。(什么是装饰器,暂时可以理解为给函数动态加上功能的一种语法)。@property的内部实现是比较复杂的。现在我们先学会如何使用,等以后有了一定的分析源码的能力,再回过头分析其内部实现。

从今天以后,在Python编程中,你一看到,第一反应就是:@property专门负责把一个方法变成同名属性的。

解释:上面我们用修饰了方法,此时会把方法直接变成同名属性。当我们获取属性的值时,实际上就是调用的此方法。

此时,本身又自动创建了另一个装饰器,负责把一个方法变成属性赋值,即:price的setter方法。于是,修饰的其实是,当我们给赋值时,实际上就是调用的此方法。

接下来验证上面的解析:

运行结果:

可见,我们给price设置的数值时,会被修饰的方法,即:过滤处理。我们设置一个合法的价格,重新运行:

@property补充

1.我们还可以定义只读属性,即只定义getter方法,不定义setter方法就是一个只读属性。

例如:我们给上面的类,新增一个轮胎个数的只读属性:

读取该轮胎个数属性,用下面代码进行验证:

运行结果:

读取成功。我们尝试设置轮胎个数为5,代码如下:

运行结果如下:

会报错:,

只读属性示例

如果你也在用PyChar编辑器,细心的你可以发现:当我们给一个只读属性赋值时,编辑器会提示:属性不能被赋值。

2.@property修饰的方法名可以和@property自动生成的装饰器修饰的方法名必须相同。

上面例子中,我们采用了相同的方法名。下面我们尝试修改修饰的方法名为::

运行结果:

这样尝试修饰的方法一个为:,一个为让方法名不同后,再给赋值时,就会报错。并且编译器会提示:

修饰的方法名不相同时的提示语

小结

广泛应用在Python类的定义中非常常见。这即可以让调用者写出简短的代码,同时又起到了对参数进行必要的检查,这样程序运行时就减少了出错的可能性,这一节知识务必熟练掌握。

人人懂编程ID:pythonDNA

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G1V4FF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券