property 本身是一个内置函数,一般用作装饰器(@property),使得我们使用类方法时可以像使用类属性一样简单。如对于下边一个简单的例子,
1 | class Person(object): |
我们可以这样使用类方法:
1 | p = Person(20) |
对于它的作用,正如博文 Python进阶之“属性(property)”详解 所提到的,property 主要能够做到以下两点:
将类方法转换为只读属性
(非常有用)重新实现一个属性的 setter 和 getter 方法
本文会主要围绕这两点进行阐述及拓展。
将类方法转换为只读属性
接着文章的开头,我们将类 Person 改造成如下所示:
1 | class Person(object): |
如果我们对类方法 age 进行赋值操作,则会提示:
1 | # p = Person(20) |
这就保证了类方法 age 是只读的,不能被赋值(除了构造函数中的赋值)。这个特性被应用的非常广泛。
重新实现一个属性的 setter 和 getter 方法
property 函数
学习过 C++、Java 等语言我们知道,对类成员变量的访问和设置一般会单独提供 get 和 set 函数。在 Python 中我们同样可以这样子做:
1 | class Person(object): |
这个例子的效果跟我们本文开头的例子的效果是一样的,但我们就无法像使用类属性一样去使用类方法。不过,我们只需在源代码中添加一句,就可以像使用类属性一样使用类方法:
1 | class Person(object): |
实际上,perperty 函数的原型为:
1 | property(fget=None, fset=None, fdel=None, doc=None) |
关于 property 的使用,官方给了这样一个例子:
1 | class C(object): |
多参数情况
上边我们用到的 setter 函数都是只有一个参数(除了 self),但如果有多个参数呢?我们可以将多个参数组合成一个 list 或者 tuple,然后再分别赋值给单独的变量。一个简单的例子如下:
1 | class Person(object): |
参考资料
本文会主要参考以下三篇博文:
- Python进阶之“属性(property)”详解
- Python 中的 property 属性
- 廖雪峰老师的 Python 2.7 教程之使用 @property