基地和当前与基数和偏移?

时间:2013-05-24 23:19:22

标签: python attributes

我有一个Attribute类,可以代表speedarmor等不同的属性。 Attributebaseoffsetcurrent值。 这是使用示例最简单的解释,我将以speed为例。

speed = Attribute()。 现在速度有base值,它只是我们的玩家移动的速度。 当我为玩家装备更好的跑鞋时,他会得到f.e. 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)

现在另一种表示方式的方法是使用basecurrent并将offset作为属性:

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

它们都以完全相同的方式工作,是否有理由使用其中一种?

2 个答案:

答案 0 :(得分:2)

正如评论中@Lee Daniel Crocker所提到的,这完全取决于您调整的操作更多。 您是否比更改current更频繁地更改offset? 在Python中没有首选的方法,但可能是你程序中的一个。

根据您的示例,您似乎正在创建一个人们与他人互动的游戏。 你提到了armorspeed,玩家,并且被一个减速法术击中了。 当你的玩家被一个咒语减速时,你不想将<{1}} 设置为某个东西,你想要减少它。 这很容易通过偏移完成,这正是它所用的。 但是,这也可以通过当前完成,并且代码对于两者都完全相同,即使意义不同:speed

如果你想做一个相对较慢的事(比如,减慢10%而不是10英里每小时),你可能会再次使用当前值:speed.current -= 10。 然后,使用speed.current *= 0.9版本可以实现这两个目的:

offset

正如我们在此处看到的那样,使用speed.offset -= 10 // reduce by 10 speed.offset = speed.current * 0.9 - speed.base // reduce by 10% 会使代码在使用相对减慢时更容易阅读,并且大多数人会发现currentspeed.current -= 50更明显。在进行相对减速时使用speed.offset -= 50也会更快,因为计算的东西越少。

所以,你可能经常需要两者,而且两者都不优于另一个。 我仍然会像Crocker所说的那样说,跟current一起使用,对每个人来说可能更容易理解,而且在做相对减速时更加清晰。

答案 1 :(得分:0)

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

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