python模式d中奇怪的类行为

2024-06-01 02:13:54 发布

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

我想对英雄施加狂暴效果。 抽象类:AbstractEffect和AbstractPositive(类继承人),可以接受基参数。接下来,还将创建AbstractNegative。我不确定继承方案是否正确(Hero--->;AbstractEffect)。你知道吗

from abc import ABC, abstractmethod 
class Hero:
    def __init__(self):
        self.stats = {"HP": 128}
    def get_stats(self):
        return self.stats.copy()

class AbstractEffect(ABC):
    def __init__(self, base):
        self.base = base
    @abstractmethod
    def get_stats(self):
        return self.base.stats()

class AbstractPositive(AbstractEffect):
    def __init__(self, base):
        self.base = base
    @abstractmethod
    def get_stats(self):
        return self.base.stats()

class Berserk(AbstractPositive):
    def __init__(self, base):
        self.base = base
        self.stats= self.base.stats
        self.stats["HP"] += 7
    def get_stats(self):
        return self.stats


hero = Hero() 
brs1 = Berserk(hero) 
print('brs1', brs1.get_stats()) 
brs2 = Berserk(brs1) 
print('brs2', brs2.get_stats()) 
print('brs1', brs1.get_stats())

我想接收

brs1 {'HP': 135}
brs2 {'HP': 142}
brs1 {'HP': 135}

但我明白了

brs1 {'HP': 135}
brs2 {'HP': 142}
brs1 {'HP': 142}

我犯了什么错?你知道吗


Tags: selfbasegetreturninitdefstatsclass
2条回答

因为以下代码

self.stats = {"HP": 128}

{“HP”:128}是一个容器
而且

self.stats = self.base.stats

因此,
当您使用狂暴(heroxx)来增强英雄时,self.stats["HP"] += 7实际上是在修改原始数据。所以你需要把它改成self.stats = self.base.get_stats(),然后你就可以得到你想要的。可以使用以下代码进行测试。你知道吗

from abc import ABC, abstractmethod
class Hero:
    def __init__(self):
        self.stats = {"HP": 128}
    def get_stats(self):
        return self.stats.copy()

class AbstractEffect(ABC):
    def __init__(self, base):
        self.base = base
    @abstractmethod
    def get_stats(self):
        return self.base.stats

class AbstractPositive(AbstractEffect):
    def __init__(self, base):
        self.base = base
    @abstractmethod
    def get_stats(self):
        return self.base.stats

class Berserk(AbstractPositive):
    def __init__(self, base):
        self.base = base
        self.stats = self.base.get_stats()
        self.stats["HP"] += 7

    def get_stats(self):
        return self.stats.copy()


hero = Hero()
brs1 = Berserk(hero)
print('brs1', brs1.get_stats())
brs2 = Berserk(brs1)
print('brs2', brs2.get_stats())
print('brs1', brs1.get_stats())

你被路过的人残忍地袭击了。你知道吗

在代码中,有self.stats = self.base.stats。这不能复制。因此,self.stats对于brs1brs2指的是相同的dict。当您实例化brs2时,您会对其进行更改,并且该更改会反映在brs1中。你知道吗

self.stats = self.base.stats.copy()将是一个好的开始,如果你不想这样的事情发生的话。你知道吗

也就是说,我觉得很奇怪,你想以这种方式编码状态效果…如果是我,我会让每个状态效果只包含一个修饰符,这将由character类依次处理解决这些修饰符。你知道吗

相关问题 更多 >