【发布时间】:2013-05-10 20:25:27
【问题描述】:
过去几周我一直在尽可能多地学习 OOP,我学到了很多,但我不确定这一点,我的类层次结构应该是什么样的?
想象两个类,这是一个Level-class:
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) 还是属性 (has-a-relationship) 时问自己一个问题。
问题是:玩家是一个关卡,还是玩家有一个关卡?
嗯...两者都不是。
玩家肯定不是一个级别,我敢肯定。
并且Player有它的等级,但是等级不等于Level类。
相反,玩家有等级和经验值,它们都是Level 类的属性。您还可以将经验值添加到 Player,因此从 Level 继承它是有意义的。
作为旁注,这些命名对我来说也没有任何意义。有类似的东西是有意义的:Level.increase(self) 将级别增加一。
然而,对于玩家来说,调用Player.level_up(self) 会更有意义,因为大多数(所有?)rpg 游戏都使用这种方法。
调用Player.increase(self) 并没有任何意义,你不能将Player 增加一,你将它的级别增加一。
话又说回来,打电话给Level.level_up(self) 也没有多大意义……
所以,我认为我应该使用Level,就好像它是一个接口并从中继承Player(和其他子类),但我不确定所以我决定问你,因为我反正在这里学习。
我该怎么办?将Level 与Player 一起使用的最正确方法是什么?
【问题讨论】:
-
在这种情况下,听起来 Player-Level 是一种经典的“has-a”关系。你说,“而玩家有它的等级,但等级不等于等级等级。”这到底是什么意思?
-
@Santa
Level-class 已经有一个名为level的属性。这个level属性也是Player应该有的属性,它只是一个整数来告诉我们的玩家处于哪个级别。Player也有经验值(exp),这也是Level的一个属性。这就是为什么从 Level 继承 Player 是有意义的,否则我们会调用Player.level.level来获取玩家级别的实际数值。 -
确实,player.level.level有点别扭。人们会期望该级别应该只是一个整数,而不是一个完整的类。这个“级别”的代码写在哪里,你能改变它吗?
标签: python inheritance relationship class-hierarchy