You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:29:56