Python 实现一个 Person 类,支持更新名字和年龄
快速解决
Python 3.10
class Person:
def init(self, name, age):
self.name = name # 初始化姓名属性
self.age = age # 初始化年龄属性
def update_name(self, new_name):
self.name = new_name # 更新姓名方法
def update_age(self, new_age):
self.age = new_age # 更新年龄方法
person = Person("张三", 30)
person.update_name("李四")
person.update_age(35)
常用方法
| 方法名称 | 使用场景 | 实现复杂度 | 是否推荐 | 示例代码片段 |
|---|---|---|---|---|
| 基础属性更新 | 简单数据封装 | ★☆☆☆☆ | 是 | self.name = new_name |
| @property装饰器 | 增加属性验证逻辑 | ★★☆☆☆ | 是 | @property\n def name(self): return self._name |
| __slots__优化 | 内存敏感型应用 | ★★☆☆☆ | 否 | slots = ['name', 'age'] |
| 数据类(dataclass) | Python 3.7+ 版本简化 | ★☆☆☆☆ | 是 | @dataclass\nclass Person: ... |
| 继承扩展功能 | 多态场景 | ★★★☆☆ | 否 | class Employee(Person): ... |
| 完整封装方法 | 严格控制属性修改 | ★★★☆☆ | 否 | def set_name(self, new_name): self._name = new_name |
详细说明
使用属性访问方法
class Person:
def __init__(self, name, age):
self.name = name # 调用setter方法
self.age = age # 调用setter方法
# name属性的getter
@property
def name(self):
return self._name
# name属性的setter
@name.setter
def name(self, new_name):
if not isinstance(new_name, str):
raise ValueError("姓名必须是字符串类型")
self._name = new_name
# age属性的getter
@property
def age(self):
return self._age
# age属性的setter
@age.setter
def age(self, new_age):
if not isinstance(new_age, int) or new_age < 0:
raise ValueError("年龄必须是非负整数")
self._age = new_age
user = Person("王五", 25)
user.name = "赵六" # 通过@property自动验证
user.age = 28
使用数据类(dataclass)
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
def update_name(self, new_name: str):
self.name = new_name
def update_age(self, new_age: int):
self.age = new_age
staff = Person("小红", 22)
staff.update_name("小明")
staff.update_age(23)
使用__slots__优化内存
class Person:
__slots__ = ['name', 'age'] # 限制属性,节省内存
def __init__(self, name, age):
self.name = name
self.age = age
def update_name(self, new_name):
self.name = new_name
def update_age(self, new_age):
self.age = new_age
members = [Person(f"用户{i}", 20+i) for i in range(10000)]
高级技巧
1. 属性变更通知机制
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
self._observers = []
@property
def name(self):
return self._name
@name.setter
def name(self, new_name):
if self._name == new_name:
return
self._name = new_name
self._notify_observers("name")
@property
def age(self):
return self._age
@age.setter
def age(self, new_age):
if self._age == new_age:
return
self._age = new_age
self._notify_observers("age")
def _notify_observers(self, attr):
for observer in self._observers:
observer(attr)
def add_observer(self, observer):
self._observers.append(observer)
def log_observer(attr):
print(f"{attr}属性已被修改")
p = Person("Tom", 25)
p.add_observer(log_observer)
p.name = "Jerry" # 输出:name属性已被修改
2. 使用继承扩展功能
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Employee(Person):
def __init__(self, name, age, employee_id):
super().__init__(name, age)
self.employee_id = employee_id
def update_name(self, new_name):
self.name = new_name
print(f"员工 {self.employee_id} 姓名已更新")
emp = Employee("小李", 30, "E001")
emp.update_name("小王")
常见问题
Q1:如何确保更新时的数据类型正确?
A1:通过@property装饰器添加类型检查逻辑,例如在setter方法中验证字符串和整数类型
Q2:能否同时更新名字和年龄?
A2:可以添加update_info方法同时处理两个属性:
def update_info(self, new_name, new_age):
self.name = new_name
self.age = new_age
Q3:如何处理非法年龄值(如负数)?
A3:在age属性的setter方法中添加边界检查:
@age.setter
def age(self, new_age):
if new_age < 0:
raise ValueError("年龄不能小于0")
self._age = new_age
总结
Python 实现一个 Person 类,支持更新名字和年龄 的最佳实践是通过@property装饰器实现属性封装,既能保证数据安全性又能保持代码简洁性。