,

Python属性描述应用

1. 惰性计算 2. 类型检查

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

Previous Post

Next Post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor