gpt4 book ai didi

Python:在类主体中动态创建子类

转载 作者:行者123 更新时间:2023-12-01 01:56:07 26 4
gpt4 key购买 nike

在下面的代码片段中,我尝试定义一个工厂函数,它将根据参数返回从 Hero 派生的不同类的对象。

class Hero:
Stats = namedtuple('Stats', ['health', 'defence', 'attack',
'mana', 'experience'])
RaceMaxStats = OrderedDict([
('Knight', Stats(100, 170, 150, 0, inf)),
('Barbarian', Stats(120, 150, 180, 0, inf)),
('Sorceress', Stats(50, 42, 90, 200, inf)),
('Warlock', Stats(70, 50, 100, 180, inf))
])

@staticmethod
def def_race(race: str):
return type(race, (Hero,), {'max': Hero.RaceMaxStats[race]})

Races = OrderedDict([
(race, Hero.def_race(race)) for race in RaceMaxStats.keys()
])

def __init__(self, lord, health, defence, attack, mana, experience):
self.race = self.__class__.__name__
self.lord = lord
self.stats = Hero.Stats(min(health, self.max.health),
min(defence, self.max.defence),
min(attack, self.max.attack),
min(mana, self.max.mana),
min(experience, self.max.experience))

@staticmethod
def summon(race, *args, **kwargs):
return Hero.Races[race](*args, **kwargs)

打算以后像这样使用它:

knight = Hero.summon('Knight', 'Ronald', 90, 150, 150, 0, 20)
warlock = Hero.summon('Warlock', 'Archibald', 50, 50, 100, 150, 50)

问题是我无法初始化子类,因为 Hero 尚未定义:

    (race, Hero.def_race(race)) for race in RaceMaxStats.keys()
NameError: name 'Hero' is not defined

显然,如果我用直接 type() 调用替换静态方法调用,我仍然需要定义 Hero。我的问题是如何最好地实现这种工厂。优先级是 summon() 方法保留相同的签名,并返回从 Hero 派生的类的实例。

附注上面的代码都没有成功运行过,因此它可能包含其他错误。

最佳答案

您可以使用classmethods并将您的 Races 变量定义为一种方法,该方法在类变量中首次调用后缓存其结果。它看起来像这样:

@classmethod
def def_race(cls, race: str):
return type(race, (cls,), {'max': cls.RaceMaxStats[race]})

_Races = None

@classmethod
def Races(cls, race):
if cls._Races is None:
cls._Races = OrderedDict([
(race, cls.def_race(race)) for race in cls.RaceMaxStats.keys()
])
return cls._Races[race]

@classmethod
def summon(cls, race, *args, **kwargs):
return cls.Races(race)(*args, **kwargs)

关于Python:在类主体中动态创建子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com