2020-08-06 10:22:41
在Python中,@property是一种内置装饰器,用于将类方法转换为只读属性,从而提供更优雅的属性访问方式并增强封装性。以下是其核心用法和场景的详细说明:
1. 基本作用将方法转为属性:被@property修饰的方法可通过属性访问(无需括号),而普通方法需通过函数调用(需加括号)。
class DataSet: @property def method_with_property(self): return 15 def method_without_property(self): return 15l = DataSet()print(l.method_with_property) # 输出: 15(直接访问属性)print(l.method_without_property()) # 输出: 15(需加括号调用)错误示例:若对@property方法加括号调用,会触发TypeError,因为此时方法已被视为属性(不可调用)。
print(l.method_with_property()) # 报错: 'int' object is not callable通过@property暴露属性值,同时隐藏内部实现(如以下划线命名的私有变量),防止外部直接修改。
class DataSet: def __init__(self): self._images = 1 # 内部私有属性 @property def images(self): return self._images # 只读访问l = DataSet()print(l.images) # 输出: 1l.images = 2 # 报错: AttributeError(默认不可赋值)场景2:结合setter实现可控属性修改若需允许修改属性,可通过@属性名.setter装饰器定义赋值逻辑,同时添加校验。
class DataSet: def __init__(self): self._images = 1 @property def images(self): return self._images @images.setter def images(self, value): if value < 0: raise ValueError("Images cannot be negative") self._images = valuel = DataSet()l.images = 5 # 合法修改print(l.images) # 输出: 5l.images = -1 # 报错: ValueError场景3:延迟计算(Lazy Evaluation)在属性首次访问时动态计算值并缓存,提升性能。
class Circle: def __init__(self, radius): self.radius = radius self._area = None @property def area(self): if self._area is None: print("Calculating area...") self._area = 3.14 * self.radius 2 return self._areac = Circle(2)print(c.area) # 输出: Calculating area... 12.56print(c.area) # 直接返回缓存值: 12.563. 注意事项@property的主要优势在于:
通过合理使用@property,可以显著提升代码的可读性和可维护性。