gpt4 book ai didi

Python如何将类函数从实例传递到另一个类

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

我有一个 Player 类,它具有许多属性来衡量其整体状态。我有第二个角色类(类类型),它根据玩家的角色实例为他们设置一些独特的配置。我遇到麻烦的地方是在玩家级别调用一个通用函数来衡量每个角色的独特里程碑目标。即检查每个玩家是否已达到其独特的里程碑 1。我最初尝试在初始化下使用一系列条件函数来执行此操作,但事实证明这在类中是不明智的,因此我将其移至其自己的单一功能。由于这样做,它显然失败了,因为函数正在检查的属性位于父类 (Player) 中,而不是定义函数的类 (Character) 中。

class Player:
def __init__(self, player_num, name):
self.character = Character(name)
self.player_num = player_num
self.name = name
self.power = 0
self.position = 1
self.attributeLimit = 4
self.attributes = []
self.attachments = []
self.collection = []
self.visited = []
self.setCharacterValues()
self.ms1 = self.character.Milestone1

def setCharacterValues()
#Loads Character instance data into the Player instance.

class Character:
def __init__(self, name):
self.attributes = []
self.attachments = []
self.collection = []
self.visited = []
self.name = name
if name == 'char x':
self.attributes = [1,2,3]
#etc.
#etc.

def Milestone1(self):
if self.name == 'char x':
if self.power >= 20:
return True
else:
return False
if self.name == 'char y':
if self.position >= 5:
return True
else:
return False
#etc

for i in players:
if i.ms1():
print('Passed')

现在我能想到的唯一解决方案就是简单地将函数从 Character 类移动到 Player 类。但这对我来说似乎是违反直觉的,因为这个功能正在衡量每个独特角色达到里程碑的能力。将其保留在“角色”下感觉是合适的,我只是在某个地方遗漏了一个明显的步骤。有人可以提供帮助吗?

最佳答案

请发布回溯错误消息。我认为问题出在 Milestone1() 中,您检查 self.powerself.position 但 self 引用了 Character 的实例 不是玩家,并且角色没有力量或位置属性。

这是我能想到的两个修复:

  1. 继承:如果将玩家设为角色的子类,则玩家将拥有角色的所有属性,因此能够调用 ms1()

    class Player(Character):
    def __init__(self, player_num, name):
    # self.character = Character(name) <-- not needed
    # self.ms1 = self.character.Milestone1 <-- not needed

    # since Player is a subclass of Character,
    # use super to init & it already has name and Milestone1
    super().__init__(name) # Py3 usage
    # super(Player, self).__init__(name) # Py2 usage

    我在 a simple example on repl.it 中对此进行了测试它对我有用,按播放键试试,输出是 'n',然后是 't'

    注意:in Python-2, the syntax for super is different than Python-3 ,并且您还必须提供子类 Player 和实例 self 作为参数。我在 this sample repl.it using Python-2 中使用 super(Player, self).__init__(name) 测试了继承。而且它也有效。

    另请注意:Python-2 classes should subclass object to create new-style classes .

  2. 组合:修复Milestone1(),使其使用玩家作为参数,从而有权访问权力和位置

    class Character:
    # no change

    def Milestone1(self, player):
    if self.name == 'char x':
    if player.power >= 20:
    return True
    else:
    return False

    也更新Player,将播放器实例传递给Milestone1

    class Player:
    def __init__(self, player_num, name):
    self.character = Character(name)

    # self is the Player, lambda makes ms1 callable
    self.ms1 = lambda: self.character.Milestone1(self)

    虽然 name 属性并没有真正被使用,而且这看起来有点 hacky,但我在 this simple repl.it example 中测试了它。而且它也有效。

总的来说,我认为这是一个使用继承而不是组合的好机会。问问自己:

Is a player a character? (Inheritance: #1)

Does a player have a character? (Composition: #2)

关于Python如何将类函数从实例传递到另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702534/

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