首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:未指定父级默认值的子继承

Python:未指定父级默认值的子继承
EN

Stack Overflow用户
提问于 2014-02-25 19:38:05
回答 1查看 1.8K关注 0票数 1

相当中级的程序员,但这里的Python初学者。我已经为一场比赛做了一段时间了,昨天我调整了所有的课程。在我最初只使用组合数据结构的地方,我现在使用这两种结构的混合。当我想生下那个球员时,我的问题就来了。这是相关代码。

代码语言:javascript
复制
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=Player()语句中设置为none的任何值,则会得到值错误或键错误。我试图纠正这个问题,方法是让一个缺省值块遍历所有给出的init,如果它们没有值,就将它们设置为默认的found。在我找到任何部件之前,这都是有效的。因此,在没有指定ai=none的情况下,我得到了关键错误。我非常希望我的代码具有这样的格式,如果我不为任何基本对象类属性指定一个值,那么默认值就会被传入,但是如果我指定了一个值,这个值就会被传递给基类。我的理想结局是让我的球员看起来像这样:

代码语言:javascript
复制
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,我就会出错,即使应该分配它,因为在低音类的init中,它的集合等于getid(self)。所以我要么对我的继承有问题(我真的在和Super公司做斗争),要么我的对象的签名问题,我不太清楚我的问题是什么,更重要的是为什么。我不反对戏剧性地修改代码签名,因为我仍然在编写引擎,所以还没有任何东西依赖于此。应该做些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-25 20:34:48

我认为你的班级结构应该是不同的。每个类应该只具有它所需的属性,在构建继承时添加新的属性,例如:

代码语言:javascript
复制
class Object(object):

    def __init__(self, x=0, y=0, name=None, **kwargs):
        self.x = x
        self.y = y
        self.name = name


class HighActor(Object):

    def __init__(self, corpse=None, skill=None, **kwargs):
        super(HighActor, self).__init__(**kwargs)
        self.corpse = corpse
        self.skill = skill


class Player(HighActor):

    def __init__(self, level=1, xp=0, **kwargs):
        super(Player, self).__init__(**kwargs)
        self.level = level
        self.xp = xp

在每个级别上,您都指定了属性--所有Object都应该有xyname,所有HighActor都应该有corpseskill等等。现在您可以指定参数来为层次结构的三个层次中的任何一个提供参数,或者将它们排除在外以获得默认值:

代码语言:javascript
复制
player = Player(name="player one", skill=100, xp=12) 

您可能有一些不适合这个继承方案的东西--在您的模型中拥有多个单独的继承关系是可以的,不要强迫它!

这是因为在每个**kwargs的末尾的__init__“清除”了方法没有期望的任何关键字参数到字典kwargs中,然后可以将它们传递到下一个级别。当您这样做时,super(...).__init__(**kwargs),这会将字典解压回关键字参数,而任何不存在的都将采用指定的默认值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22024439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档