【问题标题】:The class "turtles" has no attribute "forward" (Python Turtle)“海龟”类没有“前进”属性(Python Turtle)
【发布时间】:2023-07-13 00:41:01
【问题描述】:

我正在尝试进行乌龟比赛,但我收到一个错误,即“turtles”类没有“forward”属性。这是我的代码:

class turtles:   
    def __init__(self, color, posX):
        self = turtle.Turtle(shape='turtle', visible=False)
        self.color(color)
        self.penup()
        self.shape('turtle')
        self.goto(posX, -300)
        self.showturtle()
        self.setheading(90)
    def start_race(self):
        self.forward(random.randrange(0,10))

t1 = turtles('red',-150)
t2 = turtles('orange', -100)
t3 = turtles('yellow',-50)
t4 = turtles('green', 0)
t5 = turtles('light blue', 50)
t6 = turtles('blue',100)
t7 = turtles('purple', 150)

def begin_race():
    t1.start_race()
    t2.start_race()
    t3.start_race()
    t4.start_race()
    t5.start_race()
    t6.start_race()
    t7.start_race()

begin_race()

【问题讨论】:

  • 不要使用 self 作为变量名。它可能与类定义冲突。
  • self = ... 不是继承的工作方式。

标签: python inheritance python-turtle


【解决方案1】:

用这个替换你的 turtles 类:

class turtles(turtle.Turtle):   
    def __init__(self, color, posX):
        self.color(color)
        self.penup()
        self.shape('turtle')
        self.goto(posX, -300)
        self.showturtle()
        self.setheading(90)
    def start_race(self):
        self.forward(random.randrange(0,10))

Python 中的继承是通过在声明类名后在括号中指定一个类来完成的。
在这种情况下,您的 turtles 类继承自 turtle.Turtle 类,然后更改其属性。似乎在指定海龟的颜色和可见性方面也有一些重复(我为你删除了)

【讨论】:

    【解决方案2】:

    您收到此错误的原因是因为您的 turtles 类中没有名为 forward 的属性(即变量或方法)。 forward 方法是 turtle.Turtle 类的一部分。你可以用不同的方式解决这个问题:

    方法一:使用继承

    您可以从现有的 turtle.Turtle 类派生您的 turtles 类。为此,您应该进行以下更改:

    • turtles 应定义为class turtles(turtle.Turtle) 以派生自它。
    • __init__() 方法中,您不应重新分配 self,因为这是对正在初始化的实际对象的引用。
    • 您应该调用原始Turtle 类的__init__() 方法。

    所以完整的代码可能如下所示。我将start_race() 重命名为advance_race(),因为这样可以更好地描述它的作用。我添加了一个无限循环,所以你会看到海龟“赛跑”。当然,这只是为了演示。

    import random
    import turtle
    
    class turtles(turtle.Turtle):
    
        def __init__(self, color, posX):
            super().__init__(shape='turtle', visible=False)
            self.color(color)
            self.penup()
            self.goto(posX, -300)
            self.showturtle()
            self.setheading(90)
    
        def advance_race(self):
            self.forward(random.randrange(0,10))
    
    t1 = turtles('red', -150)
    t2 = turtles('orange', -100)
    t3 = turtles('yellow', -50)
    t4 = turtles('green', 0)
    t5 = turtles('light blue', 50)
    t6 = turtles('blue', 100)
    t7 = turtles('purple', 150)
    
    while True:
        t1.advance_race()
        t2.advance_race()
        t3.advance_race()
        t4.advance_race()
        t5.advance_race()
        t6.advance_race()
        t7.advance_race()
    

    方法二:使用包装类

    或者,您可以创建一个“持有”海龟对象的新类。使用此方法,您应该将海龟存储在“内部”self 并以self.turtle(或任何其他名称)访问它。

    class turtles:
    
        def __init__(self, color, posX):
            self.turtle = turtle.Turtle(shape='turtle', visible=False)
            self.turtle.color(color)
            self.turtle.penup()
            self.turtle.goto(posX, -300)
            self.turtle.showturtle()
            self.turtle.setheading(90)
    
        def advance_race(self):
            self.turtle.forward(random.randrange(0,10))
    

    (其余代码同上)

    【讨论】: