使用委托而非继承实现turtle库Food类时为何报错?如何修复?
问题:Turtle委托重构后调用distance方法出现UnboundLocalError
我用Python标准库turtle开发游戏,原本通过继承Turtle类实现的Food类运行正常:
import random class Food(Turtle): def __init__(self): super().__init__() # 其他代码...
改用委托方式重构后:
from turtle import Turtle from random import randint class Food(): def __init__(self): self.food = Turtle() # 其他代码,改为修改self.food而非self
在检测Food实例food和蛇头snake.head的碰撞时:
if snake.head.distance(food) < 15: ...
出现报错:
Traceback (most recent call last): File "D:\PycharmProjects\Various stuff beginning\Snake_retry\main.py", line 29, in <module> if snake.head.distance(food) < 15: File "C:\Users\palliativo\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 1858, in distance return abs(pos - self._position) UnboundLocalError: local variable 'pos' referenced before assignment
报错原因
turtle的distance()方法仅接受两种合法参数:另一个Turtle实例,或者(x, y)坐标元组。
原来继承Turtle时,Food实例本身就是Turtle对象,distance()能正常识别并获取其坐标;改用委托后,Food实例是自定义类对象,不属于上述两种类型,导致distance()内部逻辑无法正确初始化pos变量,最终抛出UnboundLocalError。
修复方案
方案1:直接传入内部Turtle实例
调用distance()时,传入Food类内部维护的self.food对象:
if snake.head.distance(food.food) < 15: ...
方案2:在Food类中委托distance方法
在自定义的Food类中实现distance()方法,将调用转发给内部的Turtle实例,这样外部代码无需修改:
from turtle import Turtle from random import randint class Food(): def __init__(self): self.food = Turtle() # 原有代码... def distance(self, other): # 将distance调用委托给内部的Turtle对象 return self.food.distance(other)
之后外部调用snake.head.distance(food)就能正常运行,和原来的代码逻辑保持一致。
内容的提问来源于stack exchange,提问作者palliativo
相关产品推荐
相关产品推荐

