Python property() 函数

Python3 内置函数 Python3 内置函数


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  # 会抛出异常

运行结果预期:

半径: 5
面积: 78.53975
新面积: 314.159

代码解析:

  1. 通过 property 可以定义计算属性。
  2. 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    # 会抛出异常

运行结果预期:

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

运行结果预期:

Tom

只定义 getter 不定义 setter,可以创建只读属性。


Python3 内置函数 Python3 内置函数