我可以只为一个实例装饰一个属性getter吗?

2024-10-02 10:28:45 发布

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

我想给一个dude一个改变攻击方式的项目。我想以某种方式包装dmg函数,并修改单个Dude实例的返回值

我意识到如果我装饰AttackComponent.dmg.fget,它将影响所有实例;当我只想让它影响到一个使用该项目

bonus_dmg从buff/items/etc频繁更改

class Dude:
    def __init__(self):
        self.attack = AttackComponent(self)
        self.base_dmg = 9000
        self.bonus_dmg = [9, 90, 900] 
    @property
    def total_dmg(self):
        return self.base_dmg + sum(self.bonus_dmg)

class AttackComponent:
    def __init__(self, dude):
        self.dude = dude
    @property
    def dmg(self):
        return {'physical dmg': self.dude.total_dmg}

dude1 = Dude()
dude2 = Dude()
dude3 = Dude()

我想给dude1一个可以修改dude1.attack.dmg返回的项。
例如,它将dmg的百分比转换为magic dmg,例如:

print(dude1.attack.dmg)    # {'physical dmg': 7777, 'magic dmg': 2222}
print(dude2.attack.dmg)    # {'physical dmg': 9999}
print(dude3.attack.dmg)    # {'physical dmg': 9999}

Tags: 项目实例selfinitdefclassprintattack

热门问题