我有一个Attribute
类,可以代表speed
或armor
等不同的属性。 Attribute
有base
,offset
和current
值。
这是使用示例最简单的解释,我将以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)
现在另一种表示方式的方法是使用base
和current
并将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
它们都以完全相同的方式工作,是否有理由使用其中一种?
答案 0 :(得分:2)
正如评论中@Lee Daniel Crocker所提到的,这完全取决于您调整的操作更多。
您是否比更改current
更频繁地更改offset
?
在Python中没有首选的方法,但可能是你程序中的一个。
根据您的示例,您似乎正在创建一个人们与他人互动的游戏。
你提到了armor
,speed
,玩家,并且被一个减速法术击中了。
当你的玩家被一个咒语减速时,你不想将<{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%
会使代码在使用相对减慢时更容易阅读,并且大多数人会发现current
比speed.current -= 50
更明显。在进行相对减速时使用speed.offset -= 50
也会更快,因为计算的东西越少。
所以,你可能经常需要两者,而且两者都不优于另一个。
我仍然会像Crocker所说的那样说,跟current
一起使用,对每个人来说可能更容易理解,而且在做相对减速时更加清晰。
答案 1 :(得分:0)
我更喜欢第一个变体,其中base
和offset
是实际值,current
是计算的有效值。但是,我不会添加一个setter,因为setter是否应设置基值或偏移量是不明确的。请将有效值保留为只读。
另外,我至少会考虑将修饰符设为列表,这可能更容易实现和调试。考虑添加速度运动鞋,给出+50。然后,饮用速度快的药水,给予+ 10%。然后你再次脱下运动鞋,最后药水耗尽。如果使用您的方法使此代码正确,则它将在属性修改属性的位置外部具有所有逻辑。这只是我的直觉,你必须自己做出决定,因为只有你知道真正的代码以及它应该做什么。