Python @property 图片看不了?点击切换HTTP 返回上层
既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性,除了使用 property() 函数,Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property 的语法格式如下:
运行结果为:
也就是说,在使用 Rect 类时,无法对 area 属性重新赋值,即运行如下代码会报错:
运行结果为:
而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,它的语法格式如下:
再次运行如下代码:
运行结果为:
除此之外,还可以使用 deleter 装饰器来删除指定属性,其语法格式为:
然后运行如下代码:
运行结果为:
@property 的语法格式如下:
@property
def 方法名(self)
代码块
1 2 3 4 5 6 7 8 9 | class Rect: def __init__(self,area): self.__area = area @property def area(self): return self.__area rect = Rect(30) #直接通过方法名来访问 area 方法 print( "矩形的面积是:" ,rect.area) |
矩形的面积为: 30
上面程序中,使用 @property 修饰了 area() 方法,这样就使得该方法变成了 area 属性的 getter 方法。需要注意的是,如果类中只包含该方法,那么 area 属性将是一个只读属性。也就是说,在使用 Rect 类时,无法对 area 属性重新赋值,即运行如下代码会报错:
1 2 | rect.area = 90 print( "修改后的面积:" ,rect.area) |
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 10, in <module>
rect.area = 90
AttributeError: can't set attribute
而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,它的语法格式如下:
@方法名.setter
def 方法名(self, value):
代码块
1 2 3 | @area.setter def area(self, value): self.__area = value |
1 2 | rect.area = 90 print( "修改后的面积:" ,rect.area) |
修改后的面积: 90
这样,area 属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。除此之外,还可以使用 deleter 装饰器来删除指定属性,其语法格式为:
@方法名.deleter
def 方法名(self):
代码块
1 2 3 | @area.deleter def area(self): self.__area = 0 |
1 2 | del rect.area print( "删除后的area值为:" ,rect.area) |
删除后的area值为: 0