有一个类跟踪它的实例是Pythonic吗?

时间:2012-03-30 09:29:02

标签: pygame python

使用以下代码段

class Missile:
    instances = []

    def __init__(self):
        Missile.instances.append(self)

现在拿代码:

class Hero():
    ...
    def fire(self):
        Missile()

当英雄射击时,需要创建导弹并将其附加到主列表中。因此,当激活时,英雄对象需要引用该列表。以下是一些解决方案,但我确信还有其他解决方案:

  • 使列表成为全局列表
  • 使用类变量(如上所述)或
  • 让英雄对象拥有对列表的引用。

我没有在gamedev上发布这个,因为我的问题实际上更为笼统:以前的代码是否合适?鉴于这种情况,是否有更多的Pythonic解决方案?

5 个答案:

答案 0 :(得分:5)

问题:

  • 英雄一旦发射,是否可以进一步控制导弹?
    • 是 - >保持列表与英雄实例
    • 否 - >把它留在别的地方
  • 导弹级别是否需要了解已制造的导弹以制造新导弹或以其他方式处理导弹?
    • 是 - >保持列表与导弹类
    • 否 - >把它留在别的地方
  • 您对上述两个问题的回答是否?
    • 是 - >保持列表作为游戏的一部分
如果你这样做的理由是有道理的话,没有任何关于将名单作为班级的一部分的unPythonic。

答案 1 :(得分:2)

我过去做过的原因与你基本相同。我真的没有看到任何问题

也许在你的情况下,通过

使列表更有意义属于英雄对象

答案 2 :(得分:2)

无论是Pythonic,我都会说优秀的OO练习要求Hero级别保留导弹列表。

(除非我遗漏了一些东西,而Missile需要知道其他人吗?)

这样的事情可能是合适的:

class Hero():
    def __init__(self):
        self.missiles = []

    def fire(self):
        self.missiles.append(Missile())

如果你需要一个'全球'导弹列表而不是每个Hero一个,那么我建议改为创建一个静态成员变量:

class Hero():
    missiles = []

    def fire(self):
        Hero.missiles.append(Missile())

答案 3 :(得分:1)

你的代码没问题,你建议的前两个解决方案是可以接受的(虽然不完全理解第三个解决方案:什么列表是“列表”?)。

根据您的需要,如果有许多类需要这种跟踪系统(如子弹,火箭,地雷......),您可以将此跟踪逻辑移动到metaclass(用于实例化类的类) )。

本质上,您将type类子类化并创建自己的“类构造函数”,然后使用语法:

__metaclass__ = my_metaclass_that_generate_classes_tracking_their_instantiation

在您要跟踪的课程中。


编辑:只是阅读您对原始问题的评论。如果你有更多的实体发射相同级别的导弹,那么最简洁的模式 - IMO - 就是让ech实体(Hero,BadGuy,Allied ......)保持自己的导弹对象列表。它模拟了您正在密切描述的世界,它将使代码维护更容易......

HTH!

答案 4 :(得分:1)

让角色跟踪他们射击的射弹可以正常工作,但这也意味着每当你移除那个角色时,它的射弹也会消失。如果我没记错的话,那就是当你摧毁悬停的MLRS​​时发生在太巴列太阳的事情 - 如果它在飞行中有任何导弹爆炸时,它们就会消失。

让角色更新功能返回它创建的射弹,所以更新循环可以将它们放在射弹列表中,也可以正常工作。每次更新处理多个射弹可以像返回一个列表一样简单 - 它可以是空的,也可以包含一个或多个射弹。

这就是我的建议:将射弹和角色(英雄,盟友,敌人等)存储在World对象中,并将对该对象的引用传递给需要与之交互的每个角色(通过发射射弹)进入世界,或通过检查附近的敌人)。对于你的英雄发射的每一枚导弹,他称他的世界为addProjectile功能。如果英雄需要执行影响游戏其余部分的其他操作,则World对象可以为其提供功能,而不必在特殊情况下使主更新循环混乱。

当然,您不仅限于一种方法。您可以随时组合它们。如果你有归位射弹,你可以给他们一个目标的参考,这样他们就可以在每次更新呼叫时更新他们的速度。如果你的射弹不能伤害射击它们的射弹,你可以给他们一个参考他们的“主人”。如果角色只能同时拥有2个射弹(如某些旧游戏),你可以让角色跟踪他们的活动射弹,这样他们就知道何时停止射击。你甚至可以让射弹跟踪他们的“朋友”,如果他们被爆炸,那么他们可以协调他们的运动,形成花哨的植绒模式。 ;)