在前面学习一文中,我们设计了一个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
领取专属 10元无门槛券
私享最新 技术干货