python@property
目录python的@property是python的一种装饰器,是用来修饰方法的。
作用
我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。让方法可以以属性的形式被访问和调用。
- 保护类的封装特性
- 使用“对象.属性”的方式操作操作类属性
class Circle:
def __init__(self, area):
self.__area = area
self.__radius=5
@property
def area(self):
return self.__area
def radius(self):
return self.__radius
circle = Circle(30)
# 直接通过方法名来访问 area 方法
print("圆的面积是:", circle.area)
# 矩形的面积是: 30
# 类中只包含该方法,那么 area 属性将是一个只读属性。
# 也就是说,在使用 Circle 类时,无法对 area 属性重新赋值
print("圆的半径是:",circle.radius())
circle.area = 90
print("修改后的面积:", circle.area)
---------------------------------------------------------------------------
圆的面积是: 30
圆的半径是: 5
Traceback (most recent call last):
AttributeError: can't set attribute
property() 函数
语法说明:
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
- fget 是获取属性值的方法。
- fset 是设置属性值的方法。
- fdel 是删除属性值的方法。
- doc 是属性描述信息。
class Student:
def __init__(self):
self._age = None
def get_age(self):
print('获取属性时执行的代码')
return self._age
def set_age(self, age):
print('设置属性时执行的代码')
self._age = age
def del_age(self):
print('删除属性时执行的代码')
del self._age
age = property(get_age, set_age, del_age, '学生年龄')
student = Student()
# 注意要用 类名.属性.__doc__ 的形式查看属性的文档字符串
print('查看属性的文档字符串:' + Student.age.__doc__)
# 查看属性的文档字符串:学生年龄
# 设置属性
student.age = 18
# 设置属性时执行的代码
# 获取属性
print('学生年龄为:' + str(student.age))
# 获取属性时执行的代码
# 学生年龄为:18
# 删除属性
del student.age
# 删除属性时执行的代码
@property 装饰器
@property
语法糖提供了比 property()
函数更简洁直观的写法。
-
被
@property
装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。 -
被
@属性名.setter
装饰的方法是设置属性值的方法。 -
被
@属性名.deleter
装饰的方法是删除属性值的方法。
class Student:
def __init__(self):
self._age = None
@property
def age(self):
print('获取属性时执行的代码')
return self._age
@age.setter
def age(self, age):
print('设置属性时执行的代码')
self._age = age
@age.deleter
def age(self):
print('删除属性时执行的代码')
del self._age
student = Student()
设置属性
student.age = 18
# 设置属性时执行的代码
# 获取属性
print('学生年龄为:' + str(student.age))
# 获取属性时执行的代码
# 学生年龄为:18
# 删除属性
del student.age
# 删除属性时执行的代码
标签:20,python,age,print,property,self,def,属性
From: https://www.cnblogs.com/tian777/p/17636360.html