一个对象可以从一个类升级到另一个类吗?(从学徒到绝地大师)

2024-09-29 01:26:11 发布

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

我想对《星球大战》中的绝地武士团建模如下:

新手可以:

  • (1) 用书学习

学徒可以:

  • (1) 用书学习
  • (2) 向他的主人学习

骑士可以:

  • (3) 开战
  • (4) 参加考试成为大师
  • (5) 成为大师(如果他通过测试)

主人可以:

  • (3) 开战
  • (6) 以一个新手为学徒(并将其转化为学徒)
  • (7) 完成学徒的训练,使其成为骑士(并将学徒转化为骑士)

我所经历的痛点是,在某个时刻,我想这样做:

anakin  # novice
obiwan  # master
obiwan.takes_padawan(anakin)
anakin  # padawan

换句话说,我想将新手类的实例提升为学徒类的实例。我看到一些解决方案仅部分解决了上述列举的约束,如:

  • 使用元类(meh)
  • 只有一个具有属性等级和多个升级方法的类

H.E.L.p哈哈

谢谢大家:)


Tags: 实例建模经历主人武士新手大师学徒
1条回答
网友
1楼 · 发布于 2024-09-29 01:26:11

您不想升级同一个对象,但可以在旧对象的基础上创建一个新对象,例如:

padawan = Padawan(novice) #creates a new Padawan using information from a novice

但是,我会更进一步,将person和技能等级/等级分开,这样person对象可以保留,但您可以替换等级(或者以任何方式调用它)。这可以让他们在自己的课程中拥有战争技能等,这是一件很好的事情。这是继承模式上的聚合或组合。这不是一个完美的解决方案,但可能会给出以下想法:

class Person:
  def __init__(self, name):
    self.name = name
    self.rank = None

  def update(self):
    if self.rank is not None:
      self.rank.do()

class Novice:
  pass

class Padawan:
  def __init__(self, person, master):
    self.person = person
    self.master = master

  def do(self):
    print(f"I am Padawan {self.person.name}, Learning from my master {self.master.person.name}")

class Master:
  def __init__(self, person):
    self.person = person
    self.padawans = []

  def take_padawan(self, person):
    person.rank = Padawan(person, self)
    self.padawans.append(person)

anakin = Person("Anakin")
anakin.rank = Novice()
obiwan = Person("Obi-Wan")
obiwan.rank = Master(obiwan)

print(anakin.rank)
obiwan.rank.take_padawan(anakin)
print(anakin.rank)
anakin.update()

你可以在https://repl.it/@ToniAlatalo/RealCompetentDevices#main.py运行它

相关问题 更多 >