Python自定义Rect类集成turtle.Turtle绘制矩形的报错修复问询
Python面向对象封装turtle矩形绘制的修复方案
问题概述
学习Python面向对象编程时,尝试自定义Rect类集成turtle.Turtle,将矩形绘制逻辑封装在draw_rect方法中,期望通过调用完成绘制,但运行报错TypeError: unsupported operand type(s) for *: 'float' and 'builtin_function_or_method',仅能在主程序层面实现绘制,无法完成类内封装。
错误原因分析
- 内置函数误用:
draw_rect方法中调用self.stylus.forward(len)时,len是Python内置函数,而非实例的self.len属性,导致turtle.forward()接收了函数对象而非数值,触发类型错误。 - 绘制逻辑不完整:原
draw_rect仅实现了单条边的绘制,未完成矩形的完整循环逻辑。 - 子类构造错误:注释的
Square子类缩进错误,且未调用父类构造方法,无法正确继承Rect的属性和方法。 - 冗余对象创建:实例化
Rect后重新创建了turtle.Turtle对象,导致类内保存的画笔对象与传入的不一致。
修复后的完整代码
import turtle class Rect: def __init__(self, rect_len, rect_wid, stylus_in): self.len = rect_len self.wid = rect_wid self.stylus = stylus_in def draw_rect(self): # 循环绘制矩形的两组对边 for _ in range(2): self.stylus.forward(self.len) self.stylus.right(90) self.stylus.forward(self.wid) self.stylus.right(90) # 修复Square子类,正确继承Rect并调用父类构造 class Square(Rect): def __init__(self, side_len, stylus_in): # 调用父类构造方法,传入边长作为长和宽 super().__init__(side_len, side_len, stylus_in) # 主程序逻辑 if __name__ == "__main__": # 创建画笔对象 stylus = turtle.Turtle() # 实例化矩形对象 rect_obj = Rect(50, 40, stylus) # 调用封装的绘制方法 rect_obj.draw_rect() # 测试正方形子类(可取消注释启用) # square_stylus = turtle.Turtle() # square_obj = Square(60, square_stylus) # square_obj.draw_rect() # 保持窗口显示 turtle.done()
关键修复点说明
- 修正属性调用:将
forward(len)改为forward(self.len),正确引用实例的长度属性。 - 完善绘制逻辑:添加
for循环完成两组对边的绘制,实现完整矩形绘制。 - 规范子类实现:
Square子类通过super().__init__()调用父类构造,复用Rect的属性和draw_rect方法。 - 简化调用逻辑:
draw_rect不再需要传入画笔对象,直接使用类内保存的self.stylus,符合封装要求,调用时只需rect_obj.draw_rect()。 - 添加窗口保持:使用
turtle.done()防止绘制完成后窗口立即关闭。
原主程序可运行代码(验证用)
import turtle smart = turtle.Turtle() for i in range(2): smart.forward(50) smart.right(90) smart.forward(70) smart.right(90) turtle.done()
内容的提问来源于stack exchange,提问作者Clive Long
相关产品推荐
相关产品推荐

