在python类中既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性,除了使用 property() 函数,Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property 的语法格式如下:
- @property
- def 方法名(self)
- 代码块
例如,定义一个动物类,并定义用 @property 修饰的方法操作类中的__color私有属性,代码如下:
- class Animal:
- def __init__(self, color):
- self.__color = color
-
- @property
- def color(self):
- return self.__color
-
-
- animal = Animal('red')
- print(animal.color)
直接通过animal.color获取属性值
运行结果为:
red
上面程序中,使用 @property 修饰了 color 方法,这样就使得该方法变成了 Animal 类的 getter 方法。需要注意的是,如果类中只包含该方法,那么 color 属性将是一个只读属性。
也就是说,在使用 Animal 类时,无法对 color 属性重新赋值.
- animal.color = 'blue'
- #
- Traceback (most recent call last):
- File "F:\pychrom_python\python\@property装饰器.py", line 15, in
- animal.color = 'blue'
- AttributeError: can't set attribute
而要想实现修改 color 属性的值,还需要为 color 属性添加 setter 方法,就需要用到 setter 装饰器,它的语法格式如下:
- @被property装饰后的方法名.setter
- def 方法名(self, value):
- 代码块
例如,为 Animal 类中的 color 属性添加 setter 方法,代码如下:
- class Animal:
- def __init__(self, color):
- self.__color = color
-
- @property
- def color(self):
- return self.__color
-
- @color.setter
- def color(self, value):
- self.__color = value
-
-
- animal = Animal('red')
- animal.color = 'blue'
- print(animal.color)
再次运行如下代码:
- animal = Animal('red')
- animal.color = 'blue'
- print(animal.color)
运行结果为:
修改后的颜色为: blue
这样,color属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。