1. 惰性计算
class LazyProperty:
"""惰性加载属性:只在第一次访问时计算"""
def __init__(self, func):
self.func = func
self.name = func.__name__
def __get__(self, instance, owner):
if instance is None:
return self
value = self.func(instance)
# 将结果缓存到实例的属性中
setattr(instance, self.name, value)
return value
class DataLoader:
def __init__(self, file_path):
self.file_path = file_path
@LazyProperty
def data(self):
print(f"正在加载文件: {self.file_path}")
# 模拟耗时操作
return [1, 2, 3, 4, 5]
loader = DataLoader("data.txt")
print(loader.data) # 正在加载文件: data.txt
# [1, 2, 3, 4, 5]
print(loader.data) # [1, 2, 3, 4, 5] —— 不再加载,直接从属性读取
2. 类型检查
class Typed:
"""强制类型检查的描述符"""
def __init__(self, expected_type):
self.expected_type = expected_type
self.name = None
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, self.expected_type):
raise TypeError(
f"{self.name} 必须是 {self.expected_type.__name__} 类型,"
f"而不是 {type(value).__name__}"
)
instance.__dict__[self.name] = value
class Student:
name = Typed(str)
age = Typed(int)
score = Typed(float)
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student("Alice", 20, 85.5)
# s.age = "20" # TypeError! age 必须是 int 类型,而不是 str