如何在 python 中创建从 turtle 模块继承的子类

2025-02-20 09:22:00
admin
原创
26
摘要:问题描述:所以,我正在尝试学习 Python,每次我在这里发布问题时,感觉就像是放弃一样……我正在尝试创建自己的 turtle.Turtle 类。 import turtle class TurtleGTX(turtle.Turtle): """My own ver...

问题描述:

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

给出回溯:AttributeError:'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)

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


解决方案 1:

总结一下 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)

解决方案 2:

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

解决方案 3:

子类化并添加自定义功能是一种很诱人的模式Turtle,例如turtle.jump()。但我见过这种模式造成的大量问题,因此我对此持谨慎态度。

调用Turtle()初始化程序(包括 的子类Turtle)会将对象注册到 turtle 模块的内部 turtle 列表中。_update()如果您不使用 禁用内部更新循环,则此列表会每帧调用一次turtle.tracer(0)。此内部 turtle不太可能像您的子类所期望的那样被垃圾收集。

除了它们所关联的更新/绘制内部函数之外,Turtle还有许多属性和方法,这些属性和方法的名称很容易与您的自定义属性和方法发生冲突(turtle 模块中大约有 150 个这样的名称,不包括双下划线)。当调用时,self.left()可能很难记住这是对超类还是对派生类的 turtle 方法调用。通过将 turtle 组合为属性而不是子类,self.turtle.left()可以使所有权完全清晰,但代价是有点冗长。

我也见过继承和组合混合在一起的情况,导致混乱的状态(文章末尾的示例)。

这里列出了继承的一些替代方法,其中一些仅用于特定目的,但为了完整性还是在这里列出:

  • 如果您不介意海龟不被垃圾收集(您计划保留固定数量的海龟),您可以分配自定义类的实例,每个实例都有一个内部self.turtle = Turtle()实例,可以通过包装器以正常方式对其进行操作。这就是组合方法。

+ 由于您可能只使用少数几个 turtle 方法,因此您可以稍微妥协一下,`self.left(n)`在组合类上添加一个方法并委托给底层`self.turtle.left(n)`。这涉及添加一些额外的方法,但避免了继承的所有陷阱。
  • 除了类之外,您还可以创建Turtle实例并将其传递给函数,以 C 风格的命令式方式执行操作:def jump(turtle, height): ...

  • 如果您计划创建某种粒子,这些粒子的创建和销毁频率相对较高,并且您只需要一个海龟来渲染而不是表示它们,那么您可以将粒子的内部表示和物理属性存储在一个类中,同时引用单个“笔”海龟。当需要绘制时,跟踪将被禁用,海龟会在所有共享粒子之间从一个位置移动到另一个位置,并根据需要进行绘制。

从理论上讲,这是一个很好的解决方案,但在实践中,我发现它对性能的影响太大,即使关闭了跟踪器。

  • 自定义类可以从 Turtle 对象池中借用,从而帮助缓解垃圾收集问题。有关详细信息,请参阅为什么我的 Python Turtle 程序运行时间越长,速度就越慢?

话虽如此,如果有人提出反驳的话,我会很想看到一个有用的、非平凡的子类化模式案例。


以下是一些由 Turtle 子类化引起的混淆情况:

  • 我该如何解决这个OOP乌龟游戏中的关键错误?

  • 在 Python 3.11 Turtle Graphics 上按下按键后,我的 Pong 游戏中的桨叶不动

  • 为什么屏幕中间有一个小箭头?

  • Turtle 子类“对象没有属性‘_shown’”

  • 乒乓球游戏类继承混乱

  • AttributeError: 'Paddle' 对象没有属性 'screen'。您的意思是:'_screen'?

  • 我的 Python 龟穿越游戏:碰撞函数不起作用

  • Python Turtle Graphics:使用 goto 时创建类错误

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用