假设你有一个游戏,你可以训练有成本的单位,并且你希望能够计算训练一定数量的单位的总成本。
所有单位共享相同的属性,但所述属性的值将在不同的单位之间发生变化。
我发现了两个潜在的解决方案,使用字典:
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
通过粗略的研究,我发现了这个问题,这表明我试图做的事情通常被认为是反模式的。所以我也不确定这个解决方案。
当考虑我的程序的演变时,我不太可能必须为单元添加新的属性,但我更有可能需要添加新的单元(具有相同的属性)。
因此,我想知道这些解决方案中的任何一个是否合适,或者是否有更好的方法来做到这一点(以及为什么它们是错误的)。
对象的属性应该是对象定义(类)的一部分。如果对象共享一组公共属性,则它们应该从父类继承。
至于应该如何存储它们,有很多方法可以做到这一点。您可以有一个父类来定义公共对象的默认属性(如@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})