Python的内置函数property

在 Python 中,property 是一个内置函数,用于将类中的方法(通常是 getter 和 setter)包装成属性,使得调用这些方法时不需要显式地调用它们,而是像访问普通属性一样访问它们。这通常用于控制对类属性的访问,添加一些额外的逻辑或验证。

property() 函数的基本用法

property() 是一个内置函数,它通常接收四个参数:

  1. fget:获取属性的函数(getter)。
  2. fset:设置属性的函数(setter)。
  3. fdel:删除属性的函数(deleter)。
  4. doc:属性的文档字符串。

简单示例

示例 1: 使用 property 实现 getter 和 setter

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    # getter 方法
    @property
    def radius(self):
        return self._radius
    
    # setter 方法
    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("Radius cannot be negative")
        self._radius = value
    
    # deleter 方法
    @radius.deleter
    def radius(self):
        print("Deleting radius")
        del self._radius

# 创建实例
circle = Circle(5)
print(circle.radius)  # 通过 property 调用 getter,输出: 5

# 设置属性,调用 setter
circle.radius = 10
print(circle.radius)  # 输出: 10

# 尝试设置非法值
try:
    circle.radius = -5  # 触发 ValueError
except ValueError as e:
    print(e)  # 输出: Radius cannot be negative

# 删除属性,调用 deleter
del circle.radius  # 输出: Deleting radius

解释:

  • @property:这将 radius 方法转换为一个只读属性(getter)。你可以像访问普通属性一样访问 circle.radius,而实际上它会调用 radius() 方法。
  • @radius.setter:这个装饰器为 radius 属性添加了一个 setter 方法,这样你可以在修改 circle.radius 时进行检查或修改。
  • @radius.deleter:这个装饰器定义了删除属性时调用的方法。

示例 2: property() 使用方式

你还可以直接使用 property() 函数来创建 getter、setter 和 deleter 方法。

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    def get_radius(self):
        return self._radius
    
    def set_radius(self, value):
        if value < 0:
            raise ValueError("Radius cannot be negative")
        self._radius = value
    
    def del_radius(self):
        print("Deleting radius")
        del self._radius

    # 使用 property() 函数
    radius = property(get_radius, set_radius, del_radius)

# 创建实例
circle = Circle(5)
print(circle.radius)  # 通过 property 调用 getter,输出: 5

# 设置属性,调用 setter
circle.radius = 10
print(circle.radius)  # 输出: 10

# 删除属性,调用 deleter
del circle.radius  # 输出: Deleting radius

总结:

  • property 让你能够以类似属性的方式访问方法,并提供额外的控制逻辑(如验证和删除操作)。
  • 使用 @property 可以定义只读属性,@property.setter 可以定义可写属性,@property.deleter 可以定义删除属性的行为。
  • property() 函数也可以手动创建 getter、setter 和 deleter,但通常使用装饰器方式更加简洁。

这种方式使得你的代码更具封装性和灵活性,尤其是当你需要在设置或获取属性时添加额外逻辑时非常有用。


文章标签:

评论(0)