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
相关产品推荐
相关产品推荐

