Python property() 函数
property() 是 Python 中用于创建属性(property)的内置函数。
property 是一种强大的机制,允许我们在访问属性时执行代码,常用于实现计算属性、数据验证等高级特性。
单词释义: property 意为"属性",用于定义类的属性。
基本语法与参数
语法格式
property(fget=None, fset=None, fdel=None, doc=None)
参数说明
- 参数 fget(可选):
- 类型: 函数
- 描述: 获取属性值时调用的函数。
- 参数 fset(可选):
- 类型: 函数
- 描述: 设置属性值时调用的函数。
- 参数 fdel(可选):
- 类型: 函数
- 描述: 删除属性时调用的函数。
- 参数 doc(可选):
- 类型: 字符串
- 描述: 属性的文档字符串。
函数说明
- 返回值: 返回一个 property 对象。
- 特点: 使属性访问看起来像普通变量,但实际上执行的是函数。
实例
示例 1:基础用法
实例
class Circle:
def __init__(self, radius):
self.radius = radius
# 使用 property 创建计算属性
def get_area(self):
"""计算圆的面积"""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""设置半径(可以添加验证)"""
if value < 0:
raise ValueError("半径不能为负数")
self.radius = value
# 创建 property
area = property(get_area, set_radius)
# 使用
c = Circle(5)
print(f"半径: {c.radius}") # 输出: 半径: 5
print(f"面积: {c.area}") # 输出: 面积: 78.53975
# 设置属性
c.radius = 10
print(f"新面积: {c.area}") # 输出: 新面积: 314.159
# 验证
c.radius = -5 # 会抛出异常
def __init__(self, radius):
self.radius = radius
# 使用 property 创建计算属性
def get_area(self):
"""计算圆的面积"""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""设置半径(可以添加验证)"""
if value < 0:
raise ValueError("半径不能为负数")
self.radius = value
# 创建 property
area = property(get_area, set_radius)
# 使用
c = Circle(5)
print(f"半径: {c.radius}") # 输出: 半径: 5
print(f"面积: {c.area}") # 输出: 面积: 78.53975
# 设置属性
c.radius = 10
print(f"新面积: {c.area}") # 输出: 新面积: 314.159
# 验证
c.radius = -5 # 会抛出异常
运行结果预期:
半径: 5 面积: 78.53975 新面积: 314.159
代码解析:
- 通过 property 可以定义计算属性。
- setter 可以添加数据验证逻辑。
示例 2:使用 @property 装饰器(推荐)
实例
class Student:
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""获取成绩"""
return self._score
@score.setter
def score(self, value):
"""设置成绩(带验证)"""
if not 0 <= value <= 100:
raise ValueError("成绩必须在 0-100 之间")
self._score = value
@property
def grade(self):
"""根据成绩计算等级"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# 使用
s = Student("Tom", 85)
print(s.name) # 输出: Tom
print(s.score) # 输出: 85
print(s.grade) # 输出: B
s.score = 92 # 设置成绩
print(s.grade) # 输出: A
s.score = 105 # 会抛出异常
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""获取成绩"""
return self._score
@score.setter
def score(self, value):
"""设置成绩(带验证)"""
if not 0 <= value <= 100:
raise ValueError("成绩必须在 0-100 之间")
self._score = value
@property
def grade(self):
"""根据成绩计算等级"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# 使用
s = Student("Tom", 85)
print(s.name) # 输出: Tom
print(s.score) # 输出: 85
print(s.grade) # 输出: B
s.score = 92 # 设置成绩
print(s.grade) # 输出: A
s.score = 105 # 会抛出异常
运行结果预期:
Tom 85 B A
代码解析:
- @property 装饰器是更 Pythonic 的写法。
- 可以定义 getter、setter、deleter。
示例 3:只读属性
实例
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
"""只读属性"""
return self._name
# 不定义 setter,则属性不可修改
p = Person("Tom")
print(p.name) # 输出: Tom
# 尝试修改会报错(没有 setter)
# p.name = "Jack" # 会抛出 AttributeError
# 删除也会报错
# del p.name # 会抛出 AttributeError
def __init__(self, name):
self._name = name
@property
def name(self):
"""只读属性"""
return self._name
# 不定义 setter,则属性不可修改
p = Person("Tom")
print(p.name) # 输出: Tom
# 尝试修改会报错(没有 setter)
# p.name = "Jack" # 会抛出 AttributeError
# 删除也会报错
# del p.name # 会抛出 AttributeError
运行结果预期:
Tom
只定义 getter 不定义 setter,可以创建只读属性。
Python3 内置函数
点我分享笔记