Python OOP:修改类属性后能否自动更新该类所有实例的薪资属性?
实现方案
完全可以实现该需求,最简洁的实现方式是通过@property装饰器将salary定义为动态计算属性,仅存储固定的基础薪资,每次获取薪资时自动用最新的涨薪比例计算,无需额外监听或遍历实例。
示例代码
class Employee: pay_raise_percent = 1.0 # 初始默认无涨薪 def __init__(self, name, base_salary): self.name = name # 基础薪资作为固定值存储为私有属性 self._base_salary = base_salary @property def salary(self): # 每次访问salary时用最新的涨薪比例动态计算 return round(self._base_salary * self.pay_raise_percent) # 实例化测试 p1 = Employee('John', 50_000) p2 = Employee('Alex', 75_000) p3 = Employee('Caleb', 90_000) # 修改类属性即可同步所有实例薪资 Employee.pay_raise_percent = 1.04 print(p1.salary, p2.salary, p3.salary, sep='\n') # 输出: # 52000 # 78000 # 93600 # 再次修改类属性,无需操作任何实例即可同步更新 Employee.pay_raise_percent = 1.1 print(p1.salary, p2.salary, p3.salary, sep='\n') # 输出: # 55000 # 82500 # 99000
方案说明
- 该方案没有额外的性能损耗,也不需要维护实例列表,适合绝大多数业务场景。
- 如果有特殊要求必须把
salary存储为实例属性,可以通过自定义元类监听类属性的修改事件,遍历所有存活的实例更新薪资值,但需要维护实例的弱引用列表,实现更复杂,还有内存泄漏的风险,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Sid Djarin
相关产品推荐
相关产品推荐

