让我们假设您有一个游戏,您可以训练附加成本的单位,并且您希望能够计算培训一定数量的单位的总成本。
所有单元都具有相同的属性,但所述属性的值将在不同的单元中发生变化。
我找到了两个使用词典的潜在解决方案:
spearmen = {'gold' : 2, 'wood' : 10, 'stone' : 5, 'iron' : 0}
swordsmen = {'gold' : 5, 'wood' : 30, 'stone': 0, 'iron' : 10}
但我发现访问信息的方式有点冗长:
swordsmen['gold'] * 1200
所以我想知道做这样的事情是否合适:
class Spearmen:
gold = 2
wood = 10
stone = 5
iron = 0
class Swordsmen
gold = 5
wood = 30
stone = 0
iron = 10
使用类使得访问信息的过程略微冗长:
Spearmen.gold * 1200
做一些粗略的研究我发现this question,这表明我经常尝试做的事情往往被视为反模式。所以我也不确定这个解决方案。
在考虑我的程序的演变时,我不太可能必须向单元添加新属性,但更可能的是我需要添加新单元(具有相同的属性)。
所以我想知道这些解决方案中的任何一个是否合适,或者是否有更好的方法(以及为什么它们是错误的)。
答案 0 :(得分:1)
对象的属性应该是对象定义(类)的一部分。如果对象共享一组公共属性,则应从父类继承它们。
至于如何存储它们,有很多方法可以做到这一点。您可以拥有一个父类来定义公共对象的默认属性(如@zondo建议的那样, Unit 类);这些属性可以存储为字典。
您可以修改继承类中的字典,以覆盖默认属性的值,或为该特定单元类型创建新值。
class BaseUnit(object):
def __init__(self, name, stats={}):
self.stats = {}
if not stats:
self.stats['health'] = 10
self.stats['armor'] = 10
self.stats['strength'] = 10
else:
self.stats.update(stats)
self.name = name
class Peon(BaseUnit):
pass
class Warrior(BaseUnit):
pass
grunt = Peon(name='Igor', {'strength': 5, 'armor': 5})
soldier = Warrior(name='Frank', {'armor': 10, 'health': 20, 'damage': 50})