【问题标题】:How can I extend a "normal" class with a static class in Python?如何在 Python 中使用静态类扩展“普通”类?
【发布时间】:2015-08-31 00:48:50
【问题描述】:

我正在使用 Python 3,并且正在尝试重写我不久前编写的图形库。现在,我有一个名为Scene 的类,除了它的构造函数之外,它还有三个方法:logic(self)update(self)render(self)

logic(self) 处理每个Scene 的逻辑。它处理所有鼠标和键盘输入,并判断按钮是否被点击等等。

update(self) 可以被认为是一种抽象方法。它的内容就是raise NotImplementedErrorupdate(self) 每秒被调用一定次数,并更新程序中正在发生的任何事情,但不会在屏幕上绘制任何内容。这是与帧率无关的更新。如果要使用这个库制作 Pong,球的位置将在此方法中更新。

render(self) 实际上会更新屏幕。这样,程序的速度就不是由帧率决定的了。

我喜欢我当前的Scene 实现。现在真的很干净,而且看起来很直观。但是,我无法克服如何扩展Scene。假设我想为像主菜单这样的基本 GUI 创建一个 Scene。我希望只有一个主菜单Scene,因为我认为每次查看和使用主菜单时都重新创建另一个Scene不是一个好主意。

我开始使用静态类扩展Scene,但很快意识到这实际上是不可能的。 当前的范例是否只是扩展 Scene 使用普通类,然后每次必须使用子类时重新创建和销毁它?例如,我应该重新创建并在查看和离开时分别销毁假设的MainMenu(Scene) 对象?

【问题讨论】:

  • 什么叫“静态类”?你能发布一些代码示例吗?
  • “静态类”是指只包含静态方法的类,并且永远不会被构造。我的意思是,我不打算让用户执行myObject = StaticClass(5, 1, 3) 之类的东西,而是调用它的方法。例如,StaticClass.doSomething()
  • 您使用了错误的工具来完成这项工作。如果你的类只有静态方法,那么它就不是一个类。除非您做了非常具体的事情(例如 Django Meta 类)并且您确切地知道原因,否则它应该是一个模块。
  • 虽然考虑到您似乎想要做的事情,但我会说它们可能应该是具有普通方法的类。能够根据某些状态创建场景并拆除它们对我来说非常有意义。
  • 你可以让他们单身。您仍然必须实例化它们,但您会阻止创建超过 1 个实例。不过,这仍然感觉像是一些不必要的限制。

标签: python class python-3.x inheritance static


【解决方案1】:

实现 GoF 所指的策略模式,您可以在其中根据当前状态动态调度到适当的逻辑。

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2012-11-22
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多