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

Python抽象类属性继承报maximum recursion depth exceeded错误排查

问题解决说明

根因定位

你遇到的递归报错完全是子类Car的属性实现逻辑问题:

  • 当你用@property装饰器定义了parking_ticket属性后,所有对self.parking_ticket的读取、赋值操作,都会自动触发对应的getter、setter方法
  • 你在getter里写return self.parking_ticket,等于在getter内部再次调用getter,直接陷入无限递归
  • 同理setter里写self.parking_ticket = ticket,等于在setter内部再次调用setter,同样会无限循环
  • 最终递归深度超过Python默认的1000层限制,抛出maximum recursion depth exceeded错误

修复方法

为parking_ticket属性新增一个下划线开头的私有变量作为实际存储载体,避免和property属性名重名触发递归调用即可:

from vehicle import Vechile
from vehicle_type import VehicleType
from parking_ticket import ParkingTicket
from datetime import datetime, timedelta


class Car(Vechile):

    def __init__(self,
                 license_plate: str) -> None:
        # 提前初始化私有存储变量,避免父类构造方法赋值时属性不存在
        self._parking_ticket = None
        super().__init__(license_plate, VehicleType.CAR)

    @property
    def parking_ticket(self):
        # 读取私有变量,不会触发property递归
        return self._parking_ticket

    @parking_ticket.setter
    def parking_ticket(self,
                       ticket: ParkingTicket):
        # 赋值给私有变量,不会触发property递归
        self._parking_ticket = ticket


# 后续测试代码无需修改
p_ticket = ParkingTicket(ticket_number="123",
                         plate_number="12345",
                         allocated_spot_id=10,
                         issued_at=datetime.utcnow(),
                         vaccated_at=datetime.utcnow() + timedelta(hours=5),
                         charges=50
                         )
c = Car('MH53TS7618')
c.parking_ticket = p_ticket
print(c)

补充说明

你的抽象基类Vechile的抽象属性定义逻辑完全正确,无需修改,父类构造方法中self.parking_ticket = None的赋值操作会自动调用子类实现的setter,最终值会存入_parking_ticket私有变量中。

内容的提问来源于stack exchange,提问作者Koushik Saha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:06