解决TypeError: strptime()参数1应为str而非datetime.datetime问题
解决Persona类
es_mayor_edad方法的TypeError问题 问题根源
主程序已将输入的出生日期字符串转换为datetime.datetime对象传入Persona实例,但es_mayor_edad方法内部错误地对已为datetime类型的出生日期调用datetime.strptime()(该方法要求第一个参数必须是字符串),从而触发TypeError。
错误代码示例
import datetime class Persona: def __init__(self, nombre, fecha_nacimiento): self.nombre = nombre self.fecha_nacimiento = fecha_nacimiento # 此处传入的是datetime对象 def es_mayor_edad(self): # 错误操作:对datetime对象调用strptime fecha_nac = datetime.datetime.strptime(self.fecha_nacimiento, "%Y-%m-%d") hoy = datetime.datetime.today() edad = hoy.year - fecha_nac.year return edad >= 18 # 主程序 fecha_str = input("Ingrese fecha de nacimiento (YYYY-MM-DD): ") fecha_dt = datetime.datetime.strptime(fecha_str, "%Y-%m-%d") persona = Persona("Juan", fecha_dt) print(persona.es_mayor_edad()) # 触发TypeError
对应的错误提示:
TypeError: strptime() argument 1 must be str, not datetime.datetime
修复方案
基础修复:直接使用已有的datetime对象
既然self.fecha_nacimiento已经是datetime类型,无需再调用strptime转换,直接用它计算年龄即可:
import datetime class Persona: def __init__(self, nombre, fecha_nacimiento): self.nombre = nombre self.fecha_nacimiento = fecha_nacimiento # 传入的是datetime对象 def es_mayor_edad(self): hoy = datetime.datetime.today() # 直接使用实例内的datetime对象计算年龄 edad = hoy.year - self.fecha_nacimiento.year # 可选:修正生日未过的情况,让年龄计算更准确 if (hoy.month, hoy.day) < (self.fecha_nacimiento.month, self.fecha_nacimiento.day): edad -= 1 return edad >= 18 # 主程序 fecha_str = input("Ingrese fecha de nacimiento (YYYY-MM-DD): ") fecha_dt = datetime.datetime.strptime(fecha_str, "%Y-%m-%d") persona = Persona("Juan", fecha_dt) print(persona.es_mayor_edad()) # 正常运行
进阶优化:兼容字符串和datetime两种输入
如果需要让Persona类同时支持传入字符串或datetime类型的出生日期,可以在__init__方法中做统一转换,确保实例内的fecha_nacimiento始终为datetime对象:
import datetime class Persona: def __init__(self, nombre, fecha_nacimiento): self.nombre = nombre # 统一转换逻辑,兼容两种输入类型 if isinstance(fecha_nacimiento, str): self.fecha_nacimiento = datetime.datetime.strptime(fecha_nacimiento, "%Y-%m-%d") elif isinstance(fecha_nacimiento, datetime.datetime): self.fecha_nacimiento = fecha_nacimiento else: raise TypeError("fecha_nacimiento debe ser cadena o datetime.datetime") def es_mayor_edad(self): hoy = datetime.datetime.today() edad = hoy.year - self.fecha_nacimiento.year if (hoy.month, hoy.day) < (self.fecha_nacimiento.month, self.fecha_nacimiento.day): edad -= 1 return edad >= 18 # 两种输入方式均可正常运行 persona1 = Persona("Ana", "1990-05-15") persona2 = Persona("Luis", datetime.datetime(1995, 3, 20)) print(persona1.es_mayor_edad()) print(persona2.es_mayor_edad())
内容的提问来源于stack exchange,提问作者Miles Gloekler Sepe
相关产品推荐
相关产品推荐

