如何有效地更新对象的属性

2024-10-04 11:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个“宠物游戏”来训练我的python计算技能(这只是一个借口:因为它很有趣)

我决定做一个简单的RPG游戏。为此,我定义了类英雄:

class hero:
    #Common class for the main character
    def __init__(self, name, lvl, str, agi, vit, int, luk, prof):
        self.name = name
        self.lvl = lvl
        self.str = str
        self.agi = agi
        self.vit = vit
        self.int = int
        self.luk = luk
        self.prof = prof
        self.exp = 0
        if prof==1:
            self.dmg=3*(self.str)+1*(self.agi)
            self.skillList=['heavySlash01']
            self.strUp=3
            self.agiUp=1
            self.vitUp=2
            self.intUp=1
            self.lukUp=1
        if prof==2:
            self.dmg=1*(self.str)+3*(self.agi)
            self.skillList=['doubleAttack02']
            self.strUp=1
            self.agiUp=3
            self.vitUp=1
            self.intUp=1
            self.lukUp=2
        if prof==3:
            self.dmg=4*(self.int)
            self.skillList=['fireBall03']
            self.strUp=1
            self.agiUp=1.5
            self.vitUp=0.5
            self.intUp=3.5
            self.lukUp=1.5
        self.hp=19*vit

然而,我注意到每当英雄升级时,我需要分别更新它的所有状态。例如,我需要手动更新hero.dmg。改变agistrint并没有像我预期的那样自动改变dmg

那么,我的问题是:有没有办法使dmg根据其公式自动更新自身


Tags: nameselfifintstragiprofdmg
2条回答

最好在您的案例中使用继承:

class Hero(object):
    def __init__(self, name, lvl, _str, agi, vit, _int, luk):
        self.name = name
        self.lvl = lvl
        self._str = _str  # Should not use "str" because of reserved keyword of the same name
        self.agi = agi
        self.vit = vit
        self._int = _int  # Should not use "int" because of reserved keyword of the same name
        self.luk = luk
        self.exp = 0

    @property
    def hp(self):
        return 19 * self.vit


class HeroProf_1(Hero):
    skillList = ['heavySlash01']
    strUp = 3
    agiUp = 1
    vitUp = 2
    intUp = 1
    lukUp = 1

    @property
    def dmg(self):
        return 3 * self._str + 1 * self.agi


class HeroProf_2(Hero):
    skillList = ['doubleAttack02']
    strUp = 1
    agiUp = 3
    vitUp = 1
    intUp = 1
    lukUp = 2

    @property
    def dmg(self):
        return 1 * self._str + 3 * self.agi


class HeroProf_3(Hero):
    skillList = ['fireBall03']
    strUp = 1
    agiUp = 1.5
    vitUp = 0.5
    intUp = 3.5
    lukUp = 1.5

    @property
    def dmg(self):
        return 4 * self._int

使dmg成为属性,而不是__init__函数中的设置。__init__只在实例初始化时运行,这就是为什么没有更新。但是,使其成为属性会在每次访问该属性时运行该方法

@property
def dmg(self):
    if prof==1:
        return 3*(self.str)+1*(self.agi)
    if prof==2:
        ...

相关问题 更多 >