向对象方法Python传递太多参数

2024-10-04 11:24:26 发布

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

所以我想我有一个非常简单的案子,但我完全不明白为什么它不能执行。在

这是我的来源-这是我的主.py我通过执行'python'来运行的文件主.py'从命令行:

import player
import enemy

p1 = player.playerClass(health = 200.0, position = [1, 0, 0], damage = 30.0)
e1 = enemy.enemyClass(position = [3, 0, 0], damage = 35.0)

print("Before attacking: " + str(e1.Health))
p1.Attack(e1, p1.Damage) # Error is here
print("After attacking: " + str(e1.Health))

攻击方法的代码位于playerClass类中。在没有Attack()方法的情况下,enemyClass是完全相同的(试图使一切尽可能简单)

^{pr2}$

从我读到的内容来看,我已经将'self'关键字应用到Attack的类定义中,当调用'p1.Attack(…)'时'p1'应该是这样传递的,但是由于某些原因我得到了错误:

TypeError: Attack() takes exactly 2 arguments (3 given)

有什么建议吗?我知道有一些关于同一问题的相关问题,但这些问题解释了为什么需要“自我”,我已经(有点)明白了。在


Tags: pyimportpositionplayerprinthealthdamageattack
2条回答

试着定义你的player.playerClass播放器类像这样

class playerClass:
  def __init__ (self, health, position, damage):
    self.health = health
    self.position = position
    self.damage = damage
  def Attack(self, target, damage):
    self.CurrentTarget = target
    target.Health -= damage
    self.CurrentTarget = None

self是什么意思?在

self基本上是python自动传递给初始化类的方法的参数。self的值等于类实例的值。所以在您的例子中,在方法Attake ()self等于p1。通过运行self.CurrentTarget = target你正在做与p1.CurrentTarget = target相同的事情

我最终找到了解决方案,这和@martijin的建议有点关系。在

问题是我把python文件编译在主.py文件是从-反过来,当python执行时,它引用的是这些编译的.pyc文件,而不是我正在编辑的实际脚本文件。在

删除这些编译的.pyc文件解决了我的问题,因为python现在似乎引用了正确的.py脚本文件。在

谢谢大家的投入!在

相关问题 更多 >