Python中的property介绍
Python中进行OOP(面向对象程序设计)时,获取、设置和删除对象属性( attribute)的时候,常常需要限制对象属性的设置和获取,比如设置为只读、设置取值范围限制等,从而既能提高保护类的封装性。为此,Python提供了两种实现机制,property() 函数和 @property 装饰器。有关这些称为Python的property(特征、特性)。
【官网介绍中文内置函数 — Python 3.11.2 文档
英文Built-in Functions — Python 3.11.2 documentation 】
关于Python面向对象程序设计可参见https://blog.csdn.net/cnds123/article/details/108354860
一、property() 函数
语法:
property(fget=None, fset=None, fdel=None, doc=None)
返回 property attribute
说明:
fget 是获取属性值的方法。
fset 是设置属性值的方法。
fdel 是删除属性值的方法。
doc 是属性描述信息。如果省略,会把 fget 方法的 docstring 拿来用(如果有的话)
下面给出property() 函数示例
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 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。
被 @属性名.setter 装饰的方法是设置属性值的方法。
被 @属性名.deleter 装饰的方法是删除属性值的方法。
特别提示:
若省略设置属性值的方法,此时该属性变成只读属性。如果此时仍然设置属性,会抛出异常 AttributeError: can't set attribute。
如果报错 RecursionError: maximum recursion depth exceeded while calling a Python object,很可能是对象属性名和 @property 装饰的方法名重名了,一般会在对象属性名前加一个下划线 _ 避免重名,并且表明这是一个受保护的属性。
下面给出@property 装饰器示例
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
"""
删除属性时执行的代码
"""
运行效果:
附录、进一步了解学习
Python中property属性的用处详解https://www.jb51.net/article/243992.htm
Python特殊属性property原理及使用方法解析https://www.jb51.net/article/197106.htm
Python的特性(property) https://www.cnblogs.com/blackmatrix/p/5646778.html
Python 从attribute到property详解https://cloud.tencent.com/developer/article/1741854