属性描述符与 property
@property 装饰器、setter/deleter、__slots__ 内存优化
属性描述符与 property
@property 把方法伪装成属性——访问时自动调用 getter,赋值时经过 setter 验证。
学完本章你将: 掌握 @property/setter/deleter、slots 内存优化。
@property 基本用法
python
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
"""摄氏度"""
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("低于绝对零度")
self._celsius = value
@property
def fahrenheit(self):
"""华氏度(只读计算属性)"""
return self._celsius * 9 / 5 + 32
t = Temperature(25)
print(t.celsius) # 25(像属性一样访问)
print(t.fahrenheit) # 77.0
t.celsius = 30 # 经过 setter 验证
# t.fahrenheit = 100 # ❌ 只读属性,没有 setter
__slots__ —— 内存优化
python
class Point:
__slots__ = ("x", "y") # 禁止动态添加属性,节省内存
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(1, 2)
# p.z = 3 # ❌ AttributeError——没有 __dict__
💡 大量创建小对象时(如游戏中的点、数据处理),
__slots__可减少 50%+ 内存开销。