【发布时间】:2014-02-25 19:38:05
【问题描述】:
相当中级程序员,但这里是 Python 初学者。我从事游戏已经有一段时间了,昨天我重组了我所有的课程。我最初只使用组合数据结构,现在我混合使用两者。当我想生成播放器时,我的问题就出现了。这是相关代码。
class Object(object):
def __init__(self, **kwargs):
DeaultValues={'x':0, 'y':0, 'name':None, 'texture':None, 'blocks':False, 'ObjectID':None, 'Fighter':None, 'Corpse':None, 'Skill':None, 'ai':None}
for key,value in DeaultValues.items():
try:
vars(self)[key] = kwargs[key]
except ValueError:
vars(self)[key] = value
except KeyError:
vars(self)[key] = value
self.x = kwargs['x']
self.y = kwargs['y']
self.name=kwargs['name']
self.blocks=kwargs['blocks']
self.ObjectID=self.AttachID()
self.texture = kwargs['texture']
#This section binds an actors compenents to itself
self.Corpse = kwargs['Corpse']
if self.Corpse:
self.Corpse.owner = self
self.Skill=kwargs['Skill']
if self.Skill:
self.Skill.owner = self
self.Fighter = kwargs['Fighter']
if self.Fighter:
self.Fighter.owner = self
self.ai = kwargs['ai']
if self.ai:
self.ai.owner = self
class HighActor(Object):
def __init__(self, **kwargs):
super(HighActor, self).__init__(**kwargs)
class Player(HighActor):
def __init__(self, Level=1, Xp=0, PreviousLevel=0, PreviousLevelThreshold=100, LevelThreshold=500, **kwargs):
super(Player, self).__init__(**kwargs)
self.LevelThreshold = LevelThreshold
self.PreviousLevelThreshold=PreviousLevelThreshold
self.PreviousLevel=PreviousLevel
self.Level = Level
self.Xp = Xp
def SpawnPlayer():
global player
FighterComponent = Fighter(MaxHp=100, Hp=100, IsHasted=[False, False], death_function=None)
CorpseComponent = Corpse()
SkillComponent = HighActorSkill()
player=Player(name="player", x=None, y=None, texture="player.png", blocks=True, ObjectID=None, Fighter=FighterComponent, Corpse=CorpseComponent, Skill=SkillComponent, ai=None)
上面的代码工作得很好,但它并没有真正继承任何东西。为了使播放器对象不出错,我必须添加以将基对象类的所有属性添加到播放器初始化中。如果我删除任何在 player=Player() 语句中设置为 none 的值,我会收到值错误或键错误。我试图通过一个默认值的字典来纠正这个问题,该字典遍历所有给定 init 的 kwargs,如果它们没有值,则将它们设置为找到的默认值。这一直有效,直到我得到任何组件。所以在没有指定ai=none的情况下,我得到了关键错误。我真的很希望我的代码采用这样的格式,如果我没有为任何基对象类属性指定值,则默认值将被传入,但如果我指定了一个值,则会传递给基类。我理想的最终结果是让我的玩家实例看起来像这样:
def SpawnPlayer():
global player
FighterComponent = Fighter(MaxHp=100, Hp=100, IsHasted=[False, False], death_function=None)
CorpseComponent = Corpse()
SkillComponent = HighActorSkill()
player=Player(name="player", texture="player.png", blocks=True, Fighter=FighterComponent, Corpse=CorpseComponent, Skill=SkillComponent)
我怀疑我的继承不能 100% 工作,因为如果我遗漏了 ObjectID,即使应该分配它也会出错,因为在 Bass 类的 init 中它的集合等于 getid(self)。所以我要么是我的继承有问题(我真的在与 Super 斗争),要么是我的对象的签名,我不太确定我的问题是什么,更重要的是为什么。我不反对大幅更改代码签名,因为我仍在编写引擎,所以还没有任何东西依赖于此。应该怎么做?
【问题讨论】:
标签: python-2.7 dictionary initialization multiple-inheritance super