Skip to main content
 首页 » 编程设计

python之玩家应该继承还是拥有关卡

2025年05月04日11lexus

过去几周我一直在努力学习 OOP,我学到了很多,但我不确定这一点,我的类层次结构应该是什么样的?

假设有两个类,这是一个Level类:

class Level(object): 
    def __init__(self, level, exp): 
        self.level = level 
        self.exp = exp 
 
    @property 
    def required_exp(self, level=None): 
        return 80 + 40 * (level or self.level) 
 
    def add_exp(self, exp): 
        self.exp += exp 
        while self.exp >= self.required_exp: 
            self.exp -= self.required_exp 
            self.level += 1 

显然它还有一些其他方法,但这是基本思想。

现在第二个类叫做Player。它有一些属性,比如:name, health, level, experience points, damage等

到目前为止我所学到的(SO 上的某个人这样说)是在我不确定是使用继承(is-a-relationship)还是属性( 有一个关系)。 问题是:Player 是一个 Level,还是 Player 有一个 Level?

嗯……两者都不是。 Player肯定不是一个级别,这一点我敢肯定。 Player 有它的级别,但级别不等于 Level 类。 相反,Player 具有等级和经验值,它们都是 Level 类的属性。您还可以向 Player 添加经验值,因此从 Level 继承它是有意义的。

作为旁注,这些命名对我来说也没有任何意义。有这样的东西是有意义的: Level.increase(self) 将 Level 增加一个。 然而,对于玩家来说,调用 Player.level_up(self) 会更有意义,就像在大多数(所有?)角色扮演游戏中所使用的那样。 调用 Player.increase(self) 没有任何意义,您不能将 Player 增加一个,而是将其级别增加一个。 再一次,调用 Level.level_up(self) 也没有多大意义......

因此,我认为我应该像使用接口(interface)一样使用 Level 并从中继承 Player(和其他子类),但我不确定是否如此我决定问你,反正我是来学习的。 我应该怎么办?将 Level 与 Player 一起使用的最正确方法是什么?

请您参考如下方法:

我相信我就是让你问自己这个问题的人:“A 类是 B 类,还是 A 类有 B 类?”,所以我觉得我必须回答这个问题。

我不能 100% 确定您的关卡实际作用是什么,但我假设它与《口袋妖怪》、《魔兽世界》、《英雄联盟》和数以千计的其他游戏中使用的关卡类似。 如果是这样,您的 Level 类就已经出错了,它不应该是那样的。

你肯定在一件事上是对的; “玩家肯定不是一个级别的” 正如其他人已经提到的那样,您应该选择 has-a 关系。 球员确实有水平,我们都知道这一点。 但是,你告诉我玩家没有 Level 类型的属性,而是一个整数 level 属性来保存你的 Level 的数值-类。

这应该已经敲响了一些警钟,但这里有一个提示:它与具有一个名为 name 的 string 类型属性的 Name 类是一样的 在里面。

所以答案是: Name 类本身应该已经是一个字符串,它应该继承自 string,而不是在其中包含一个 string 属性来保存它的值。 这同样适用于您的 Level,它本身已经是一个整数,因此从 int 继承它,然后添加 exp 及其方法。

现在您可以使用player.level 返回玩家等级的整数值。 要获得 exp,您“必须”使用 player.level.exp。 我引用了“必须”,因为即使听起来很奇怪,exp 也是关卡的一个属性。 它基本上与数字的小数点相同,有意义吗?

此外,调用类似 player.level.increase() 的方法现在更有意义了。 虽然,它已经是一个整数值,但为什么不直接执行 player.level += 1 呢? 如果您需要在添加中添加一些高级内容,您可以重写 Level.__add__(self, value) 方法。 我想不出你为什么不需要这个的单一原因? (不是现在您已经将 required_exp 设为属性)