【问题标题】:Text Adventure in Python: Working with Classes and InheritancePython 中的文本冒险:使用类和继承
【发布时间】:2019-11-19 08:52:15
【问题描述】:

我对 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()

通过在类之外调用此代码,我想使用函数攻击,从而降低用户的健康状况。

我还是个新手,各种方法都试过了。

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

https://trinket.io/python/07c3a147aa

不幸的是,它是用遗留代码编写的,我不熟悉 2.7 和 3.8 之间的所有差异。我试图调整和剖析代码,以便更好地理解底层流程,但我运气不佳。它不断在多个位置出现故障,我不断在各处收到“属性错误”。

我真正喜欢这段代码的一点是角色可以输入“帮助”或“攻击”之类的命令,然后调用相应类的函数。我想修改此代码,使其更适合我的需求,例如向其中添加其他功能和字符,但我真的没有太多运气。

如果有人可以帮助修复我非常有缺陷的代码和思想,我将非常感激。

我也感谢您抽出时间阅读本文。

克里斯托弗

【问题讨论】:

  • 如果这是您拥有的全部代码,那么解决方案很简单:您没有名为“stärke”的属性,我建议不要在编码。否则,如果这不是您的全部代码,请提供其余代码。
  • 您好,Boendal,这不是问题所在。我只是忘了更改条款。我仍然会得到像 TypeError: attack() missing 1 required positional argument: 'self' NameError: name 'self' is not defined 谢谢你让我知道我忘了更新它。
  • 我不完全确定你在这里问什么。但是你不是说boo.attack()吗? “monster”是类,而不是实例(请注意,如果您使用正确的 Python 样式,这会更清楚,即类名的 InitialCaps:Monster、Character)。
  • 嘿,哇,这实际上帮了很多忙。该程序没有显示任何错误,但也没有产生预期的效果,请原谅我对术语的正确掌握。感谢您指出正确的风格。我忘记了类必须大写。我只是忘了使用它,因为我讨厌在编写代码时使用大写字母。基本上,每当我调用函数“boo.attack()”时,我希望角色 John 的健康状况减少 1 点。
  • 好吧,那么你需要告诉怪物他们正在攻击的是谁,即约翰。因此,您需要接受(例如)“目标”作为“攻击”的参数,并从中减去生命值而不是自身。

标签: python class subclass legacy-code


【解决方案1】:

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

def attack (self):
     self.health-1

这应该是:

def attack(self):
    self.health -= 1

您的原始代码从 health 的值中减去一个,然后将结果丢弃。

还有第二个问题:

boo=monster("boo",20,22)
monster.attack()

这应该是:

boo=monster("boo",20)
boo.attack()

如果你想调用一个类方法,你需要在该类的对象上这样做,而不是在类本身上。

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

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

john.attack()

(这当然需要一个适合角色类的攻击函数)

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

def attack(self, target):
    target.health -= 1

然后执行攻击:

boo.attack(john)

【讨论】:

  • 他做的另一个混淆是怪物只有2个参数而不是3个
  • 非常感谢您的帮助!嘿,是的,我也注意到了参数。不过我基本上差不多。因此,您建议的代码确实运行良好。但是,我希望它来自 John,而不是来自 boo。每当我调用 boo.attack() 时,该对象都会被缩减,但我希望对象 John 被缩减。
  • 我对此请求进行了编辑。对于未来,我建议您在原始问题中包含此类细节。节省大量编辑。
  • 是的,你是对的。我将在未来的问题中包含此类信息。我试图尽可能详细。感谢您的帮助,它确实帮助我了解了我的代码出了什么问题。谢谢!
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多