移动终端开发技术,seo伪原创工具,网页设计与制作难不难,抖音直播间挂人气自助网站文章目录 核心概念对比1. 根本目的差异2. 调用场景对比深入解析:何时使用哪种方法场景 1:开发者调试 vs 用户展示场景 2:技术表示 vs 简化视图高级对比:特殊场景处理1. 容器中的对象表示2. 日志记录的最佳实践3. 异常信息展示最佳实践指南1. 何时实现哪个方法?2. 实现原则… 文章目录 核心概念对比1. 根本目的差异2. 调用场景对比 深入解析:何时使用哪种方法场景 1:开发者调试 vs 用户展示场景 2:技术表示 vs 简化视图 高级对比:特殊场景处理1. 容器中的对象表示2. 日志记录的最佳实践3. 异常信息展示 最佳实践指南1. 何时实现哪个方法?2. 实现原则3. 默认行为与继承4. 使用 dataclass 简化 常见陷阱与解决方案陷阱 1:只实现一个方法陷阱 2:在 `__str__` 中包含技术细节陷阱 3:忽略安全性 实际应用:综合示例总结:`__repr__` 与 `__str__` 的选择策略 在 Python 面向对象编程中,__repr__ 和 __str__ 是两个最常被混淆的特殊方法。本文将深入解析它们的区别、最佳实践以及如何在实际开发中正确使用它们,避免常见的陷阱。 核心概念对比
1. 根本目的差异
特性__repr____str__核心目标无歧义的技术表示用户友好的可读表示目标用户开发者最终用户设计原则明确性、精确性简洁性、可读性理想特性eval(repr(obj)) == obj美观、易懂的输出2. 调用场景对比
class Demo:def __repr__(self):return "Demo.__repr__()"def __str__(self):return "Demo.__str__()"obj = Demo()操作/场景使用的方法输出示例print(obj)__str__Demo.__str__()str(obj)__str__Demo.__str__()repr(obj)__repr__Demo.__repr__()交互式环境直接输入 obj__repr__Demo.__repr__()[obj](在容器中)__repr__[Demo.__repr__()]f"{obj}"__str__Demo.__str__()logging.debug(obj)__str__*取决于日志配置*注意:日志模块默认使用 __str__,但调试时建议显式使用 repr() 深入解析:何时使用哪种方法
场景 1:开发者调试 vs 用户展示
class Product:def __init__(self, id, name, price):self.id = idself.name = nameself.price = pricedef __repr__(self):# 开发者需要看到所有关键信息return f"Product(id={self.id!r}, name={self.name!r}, price={self.price!r})"def __str__(self):# 用户只需要看到友好信息return f"{self.name} - ¥{self.price:.2f}"# 使用示例
p = Product("P1001", "无线耳机", 299.99)print(repr(p)) # 开发者调试: Product(id='P1001', name='无线耳机', price=299.99)
print(p) # 用户展示: 无线耳机 - ¥299.99场景 2:技术表示 vs 简化视图
class NetworkDevice:def __init__(self, ip, mac, status):self.ip = ipself.mac = macself.status = statusdef __repr__(self):# 完整技术细节return (f"NetworkDevice(ip={self.ip!r}, mac={self.mac!r}, "f"status={self.status!r})")def __str__(self):# 简化状态显示status_map = {"up": "✓ 运行中", "down": "✗ 已断开"}return f"设备 {self.ip} [{status_map.get(self.status, '?')}]"# 使用示例
router = NetworkDevice("192.168.1.1", "00:1A:2B:3C:4D:5E", "up")print(repr(router))
# 输出: NetworkDevice(ip='192.168.1.1', mac='00:1A:2B:3C:4D:5E', status='up')print(router)
# 输出: 设备 192.168.1.1 [✓ 运行中]高级对比:特殊场景处理
1. 容器中的对象表示
class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef __repr__(self):return f"Student({self.name!r}, {self.grade!r})"def __str__(self):return f"{self.name} ({self.grade})"# 创建学生列表
classroom = [Studen