0

我有一个Attribute类,它可以表示不同的属性,例如speedor armorAttribute有一个base,一个offset和一个current值。这使用示例最容易解释,我将speed用作示例。

speed = Attribute(). 现在速度有了一个base值,它只是我们玩家移动的速度。当我为玩家装备更好的跑鞋时,他会获得 50 的额外速度。这意味着offset将赌注设置为50。现在,当有人施放一个让你减速 10 的咒语时,偏移量将变为50 - 10 = 40。属性类看起来像这样:

class Attribute(object):
    def __init__(self, base):
        self.base = base
        self.offset = 0

    @property
    def current(self):
        return self.base + self.offset

    @current.setter
    def current(self, value):
        self.offset = 0 - (self.base - value)

现在表示它的另一种方法是使用baseandcurrent和 haveoffset作为属性:

class Attribute(object):
    def __init__(self, base):
         self.base = base
         self.current = base

    @property
    def offset(self):
         return 0 - (self.base - self.current)

    @offset.setter
    def offset(self, value):
         self.current = self.health + value

它们都以完全相同的方式工作,是否有理由使用一个而不是另一个?

4

2 回答 2

2

正如@Lee Daniel Crocker在评论中提到的那样,这完全取决于您调整的更多操作。你改变current的频率比你改变的多offset吗?Python 中没有首选方式,但您的程序中可能有一种方式。

根据您的示例,您似乎正在创建一个人们与他人互动的游戏。你提到了armor,,speed玩家,并被减速法术击中。当你的玩家被一个咒语减速时,你不想给他设置speed什么,你想减少它。这很容易通过偏移量完成,这正是它的用途。但是,这也可以用当前来完成,并且两者的代码完全相同,即使含义不同:speed.current -= 10.

如果你想做一个相对慢的速度(比如,让他慢 10% 而不是 10mph),你可能会再次使用当前值:speed.current *= 0.9. 再一次,这两个都可以通过以下offset版本实现:

speed.offset -= 10 // reduce by 10
speed.offset = speed.current * 0.9 - speed.base // reduce by 10%

正如我们在这里看到的,current在使用相对缓慢时, using 使代码更易于阅读,大多数人会发现speed.current -= 50speed.offset -= 50. current在进行相对减慢时使用它也更快,因为计算的东西更少。

因此,您可能经常需要两者,并且两者都不优于另一个。我仍然会像克罗克所说的那样说,go with current,它可能对每个人都更容易理解,并且在相对放慢时更干净。

于 2013-05-24T23:58:28.737 回答
0

我更喜欢第一个变体,其中baseoffset是实际值,current是计算出的有效值。但是,我不会添加 setter,因为该 setter 应该设置基值还是偏移量是不明确的。将有效值保留为只读。

另外,我至少会考虑将修饰符设为一个列表,这可能更容易实现和调试。考虑添加速度运动鞋,给予+50。然后,喝一瓶迅捷药水,给予+10%。然后你再次脱下运动鞋,最后药水用完了。如果您使用您的方法使此代码正确,它将在属性被修改的位置具有属性外部的所有逻辑。这只是我的直觉,你必须自己做出决定,因为只有你知道真正的代码以及它应该做什么。

于 2013-05-25T06:06:31.133 回答