所以,我正在努力学习python,每次我在这里发布一个问题,感觉就像屈服了...
我在努力培养我自己的乌龟。乌龟。
import turtle
class TurtleGTX(turtle.Turtle):
"""My own version of turtle"""
def __init__(self):
pass
my_turtle = TurtleGTX()
my_turtle.forward(10)
提供追溯:属性错误:'TurtleGTX'对象没有属性'_position'。然后我了解到它是一个"私有变量",根据官方的python教程,我可以在我的子类TurtleGTX中修改/覆盖它。如何用一个像turtle这样大的程序来做到这一点似乎相当困难,这意味着我错过了一个更简单的解决问题的方法。最后我学到了,这就是重点,但我仍然想在社区中运行它,看看是否有一种优雅的方法来创建turtle.Turtle的子类(下一步是让您的turtle的行为不同于标准turtle)。
所以下面的评论让我想到也许我可以做到这一点:
import turtle
class TurtleGTX(turtle.Turtle):
"""My own version of turtle"""
my_turtle = TurtleGTX()
my_turtle.forward(100)
现在我要看看这会把我带到哪里......有些东西告诉我,我可能已经前进了一步,后退了两步,因为这意味着我将无法初始化我的子类上的任何东西......
3条答案
按热度按时间c6ubokkw1#
综合伊格纳西奥的回答和orokusaki的评论,您可能应该这样写
px9o7tmv2#
如果你在子类中重定义了一个方法(比如
__init__()
),那么你就有责任调用父类的方法,以使父类的行为得到尊重。lp0sw83n3#
子类化
Turtle
并添加自定义功能(比如turtle.jump()
)是一种很有吸引力的模式,但我在使用这种模式方面取得的成功有限,因此在大多数情况下要谨慎行事。调用
t = Turtle()
(包括Turtle
的子类)会在turtle模块的内部turtle列表中注册对象。如果不禁用内部更新循环,则每帧都会在该列表上调用_update()
。此内部turtle isn't likely to get garbage collected as your subclass might expect。除了与之挂钩的update/draw内部结构之外,
Turtle
还有许多属性和方法,它们很容易与您的自定义属性和方法发生名称冲突(turtle模块中大约有150个这样的名字,不包括dunderscore)。当调用self.left()
时,可能很难记住这是对超类还是派生类的turtle方法调用,通过将turtle作为一个属性而不是子类,self.turtle.left()
使所有权完全清楚,代价是有点冗长。我建议使用几个可选模式中的一个,这些模式在某种程度上是特定于用例的:
self.turtle = Turtle()
示例,可以从 Package 器中以正常的方式操作。Turtle
示例,并将其传递给函数,使其以C风格的命令式方式执行操作,而不是类:一米一米一。也就是说,如果有人有子类化模式的例子,我很想看到一个有用的、不平凡的例子。