4

所以,我正在努力学习python,每次我在这里发布问题时,感觉就像放弃了......

我正在尝试制作自己的turtle.Turtle。

    import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""
    def __init__(self):
        pass

my_turtle = TurtleGTX()
my_turtle.forward(10)

给出 Traceback:AttributeError:“TurtleGTX”对象没有属性“_position”。然后我学习的是一个“私有变量”,根据官方的 python 教程,我可以在我的子类 TurtleGTX 中修改/覆盖。如何使用像turtle 这样大的程序来做到这一点似乎相当困难,这意味着我错过了一个更简单的问题解决方案。最后我学到了,这就是重点,但我仍然想由社区运行它,看看是否有一种优雅的方式来创建turtle.Turtle的子类。(下一步是让你的乌龟表现得与标准乌龟不同)

所以下面的评论让我觉得也许我可以这样做:

import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""


my_turtle = TurtleGTX()
my_turtle.forward(100)

实际运行!现在我要看看这会把我引向何方……有些东西告诉我,我可能已经向前走了两步,因为这意味着我将无法在我的子类上初始化任何东西……

4

3 回答 3

8

总结 Ignacio 的回答和 orokusaki 的评论,你可能应该写一些类似的东西

import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""
    def __init__(self,*args,**kwargs):
        super(TurtleGTX,self).__init__(*args,**kwargs)
        print("Time for my GTX turtle!")

my_turtle = TurtleGTX()
my_turtle.forward(100)
于 2012-02-25T07:42:50.037 回答
2

如果您在子类中重新定义方法(例如__init__()),那么您有责任调用父类的方法以尊重父类的行为。

于 2012-02-25T04:53:01.947 回答
0

Turtle继承和添加自定义功能是一种诱人的模式,例如turtle.jump(). 但是我在这种模式上取得的成功有限,并且在大多数情况下都对它持谨慎态度。

调用t = Turtle()(包括 的子类Turtle)将对象注册到海龟模块的内部海龟列表中。_update()如果您不禁用内部更新循环,则此列表每帧都会调用它turtle.tracer(0)。这个内部海龟不太可能像您的子类所期望的那样收集垃圾,我们不应该挂钩由前导下划线表示的私有方法。即使我们可以,它也会很快变得混乱;除了它们所连接的更新/绘制内部结构之外,Turtle还有许多属性和方法可以很容易地命名冲突您的自定义方法。

我建议使用一些特定于用例的替代模式之一:

  • 如果您不介意海龟不被垃圾收集(正在制作您计划保留的固定数量),您可以分配自定义类的实例,每个实例都有一个内部self.turtle = Turtle()实例,该实例以正常方式从包装器。
  • 除了类,您可以创建Turtle实例并将它们传递给函数,使它们以 C 风格的命令式方式执行操作:def jump(turtle, height): ....
  • 如果您计划创建相对频繁地创建和销毁的某种粒子,并且您只需要一个海龟来渲染它们,您可能会使用单个“笔”海龟的引用来存储粒子的内部表示和物理属性。当需要绘制时,跟踪被禁用,并且海龟在所有共享粒子中从一个位置移动到下一个位置,根据需要进行绘制。

也就是说,如果有人有的话,我很想看到一个有用的子类模式案例。

于 2022-02-05T23:41:21.103 回答