如何在python中创建继承自turtle Module的子类

yr9zkbsy  于 2022-12-21  发布在  Python
关注(0)|答案(3)|浏览(110)

所以,我正在努力学习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)

现在我要看看这会把我带到哪里......有些东西告诉我,我可能已经前进了一步,后退了两步,因为这意味着我将无法初始化我的子类上的任何东西......

c6ubokkw

c6ubokkw1#

综合伊格纳西奥的回答和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)
px9o7tmv

px9o7tmv2#

如果你在子类中重定义了一个方法(比如__init__()),那么你就有责任调用父类的方法,以使父类的行为得到尊重。

lp0sw83n

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风格的命令式方式执行操作,而不是类:一米一米一。
  • 如果您计划创建相对频繁地创建和销毁的某种粒子,并且只需要一个海龟来渲染它们,则可以使用对单个"笔"海龟的引用来存储粒子的内部表示和物理属性。当需要绘制时,跟踪被禁用,海龟在所有共享粒子中从一个位置移动到下一个位置,根据需要绘制。
  • 自定义类可以从Turtle对象池中借用,帮助缓解垃圾收集问题。有关详细信息,请参阅为什么我的Python Turtle程序运行的时间越长,速度就越慢?

也就是说,如果有人有子类化模式的例子,我很想看到一个有用的、不平凡的例子。

相关问题