Python中的文本冒险:使用类和继承

Python中的文本冒险:使用类和继承,python,class,subclass,legacy-code,Python,Class,Subclass,Legacy Code,我对Python中的类和子类的概念相当陌生。我在Stackoverflow上找到了一些与我的问题相关的问题/答案,但它们似乎并没有真正回答我所寻找的细节。我查阅了YouTube和其他网站,但运气不太好。现在,我可能问错了问题,或者找错了地方。所以,请容忍我一点 现在,我确实理解了类在Python中是如何工作的。这不是问题所在 class Person: def __init__(self, name, age): self.name = name self.age = age

我对Python中的类和子类的概念相当陌生。我在Stackoverflow上找到了一些与我的问题相关的问题/答案,但它们似乎并没有真正回答我所寻找的细节。我查阅了YouTube和其他网站,但运气不太好。现在,我可能问错了问题,或者找错了地方。所以,请容忍我一点

现在,我确实理解了类在Python中是如何工作的。这不是问题所在

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

p1 = Person("John", 36)

print(p1.name)
print(p1.age)
这是一个相对基本的概念,我想每个人都能理解

然而,我在理解子类如何协同工作以及如何调用存储在类中的函数方面遇到了困难。我想给怪物或人类添加一个名为“伤害”的函数。我试着让怪物类继承人物类,这样它也有它的属性,并且可以对它的健康造成伤害

我想创建如下内容:

class character:
    def __init__(self, name, health ):
        self.name = name
        self.health = health

class  monster(character):
    def __init__(self, name, health):
        character.__init__(self,name,health)
        self.health = health
        self.name = name

    def attack (self):
         self.health-1

john=character("john",22)
boo=monster("boo",20,22)
monster.attack()
通过在类之外调用此代码,我希望使用函数攻击,从而降低用户的健康状况

我还是个新手,我尝试过各种方法

为了让您更好地理解我的意思,下面是我尝试使用的参考代码:

不幸的是,它是用遗留代码编写的,我不熟悉2.7和3.8之间的所有差异。我已经尝试过修改和剖析代码,以便更好地理解底层流程,但我运气不太好。它不断地在多个点上断裂,我不断地得到到处都是的“属性错误”

我真正喜欢这段代码的地方是,角色可以输入“help”或“attack”之类的命令,然后调用相应类中的函数。我想修改这段代码,以便它更好地满足我的需要,比如添加其他函数和字符,但我真的运气不太好

如果有人能帮我修复有缺陷的代码和想法,我将非常感激

我也感谢你抽出时间来读这篇文章


Christopher

除了您已经注意到的名称混淆之外,您的代码还有两个问题

def attack (self):
     self.health-1
这应该是:

def attack(self):
    self.health -= 1
boo=monster("boo",20)
boo.attack()
原始代码从健康值中减去一,然后丢弃结果

第二个问题是:

boo=monster("boo",20,22)
monster.attack()
这应该是:

def attack(self):
    self.health -= 1
boo=monster("boo",20)
boo.attack()
如果要调用类方法,需要对该类的对象而不是类本身进行调用

编辑:正如下面的评论员所注意到的,有一个参数太多了

Edit2:关于您对攻击功能的请求,显而易见的解决方案是:

john.attack()
(这当然需要角色类具有合适的攻击功能)

但也许你想让怪物攻击约翰。可以这样实现:

def attack(self, target):
    target.health -= 1
然后进行攻击:

boo.attack(john)

如果这就是您拥有的全部代码,那么解决方案很简单:您没有名为“stärke”的属性,我建议不要在编码中使用“ä,ö,andü”。否则,如果这不是您的全部代码,请提供其余的代码。你好,Boendal,这不是问题所在。我只是忘了更改条款。我仍然会得到类似TypeError:attack()的欧元缺少1个必需的位置参数:“self”NameError:name“self”未定义感谢您让我知道我忘记了更新它。我不完全确定您在这里问什么。但是你的意思是不是
boo.attack()
?“monster”是类,而不是实例(请注意,如果您使用适当的Python样式,这将更加清晰,即类名称的首字母大写:monster,Character)。嘿,哇,这实际上帮了大忙。程序没有显示任何错误,但也没有产生预期的效果,请原谅我对术语的正确掌握。谢谢你指出正确的风格。我忘了类必须大写。我只是忘了使用它,因为我讨厌在编写代码时使用大写字母。基本上,每当我调用函数“boo.attack()”,我都希望角色John的健康状况降低1分。那么,你需要告诉怪物他们正在攻击谁,即John。所以你需要接受(例如)“目标”作为“攻击”的参数,并从中减去生命值,而不是自我。他所做的另一个错误是怪物只有2个参数,而不是3非常感谢你的帮助!嘿,是的,我也注意到了参数。不过我基本上差不多。因此,您建议的代码工作得非常好。然而,我想从约翰那里得到,但不是从布那里。无论何时调用boo.attack(),该对象都会缩小,但我希望缩小该对象。我对此请求进行了编辑。对于未来,我建议您在原始问题中包含此类细节。节省了大量的编辑工作。是的,你是对的。我将在今后的问题中包括这类信息。我尽量说得详细些。我非常感谢您的帮助,它确实帮助我了解了我的代码有什么问题。谢谢