Python Turtle自定义Brick类调用goto时出现AttributeError问题求助
解决Python Turtle Brick类的AttributeError问题
问题本质
你碰到的AttributeError: 'Brick' object has no attribute '_drawing',核心原因是没有正确初始化父类turtle.Turtle的内部属性。Turtle的内置方法(比如goto)依赖这些底层属性才能运行,跳过父类初始化步骤就会导致方法调用失败。
而调用super().__init__()后砖块出现在屏幕中间,是因为父类turtle.Turtle的默认初始位置就是(0,0);无法移动大概率是因为你没在初始化时正确配置砖块的可移动状态,或者之前的错误导致方法逻辑异常。
正确的Brick类实现
直接看可运行的代码示例:
import turtle as tt class Brick(tt.Turtle): def __init__(self, x_pos, y_pos, brick_color="orange"): # 第一步:必须先调用父类初始化,创建turtle所需的全部内部属性 super().__init__() # 第二步:设置砖块的外观属性 self.shape("square") self.color(brick_color) # 拉伸形状,让它变成扁长的砖块(宽1倍,长3倍) self.shapesize(stretch_wid=1, stretch_len=3) self.penup() # 抬笔,移动时不会留下轨迹 # 第三步:设置初始位置 self.goto(x_pos, y_pos) # 主脚本测试 screen = tt.Screen() # 创建一个初始位置在(-180, 200)的砖块 test_brick = Brick(-180, 200) # 调用goto移动,现在不会报错 test_brick.goto(180, 200) screen.mainloop()
关键注意点
- 父类初始化必须优先执行:
super().__init__()要放在__init__方法的最开头,确保turtle的内部属性(包括_drawing)被正确创建。 - 初始位置手动设置:父类默认位置是(0,0),所以你需要在初始化时传入坐标并调用
goto或setpos,把砖块放到指定位置。 - 重写内置方法要保留父类逻辑:如果你在Brick类里重写了
goto、move这类方法,必须调用super().goto(x,y)来继承父类的移动逻辑,否则自定义方法会覆盖掉turtle的原生功能。
内容的提问来源于stack exchange,提问作者wcoghlan
相关产品推荐
相关产品推荐

