将太多参数传递给对象方法 - Python

时间:2016-07-20 21:21:02

标签: python arguments

所以我认为我有一个非常简单的案例,但我完全不知道为什么它不会执行。

这是我的源代码 - 这是我的main.py文件,我通过从命令行执行'python main.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))

Attack方法的代码可在playerClass类中找到。如果没有Attack()方法(尽量保持一切尽可能简单),enemyClass是完全相同的。

import character

class playerClass(character.CharacterBaseClass): # derived class used to contain an 'Attack' method, but does not anymore

    def __init__(self, health = 100.0, position = [0, 0, 0], damage = 10.0):
        self.Health = health
        self.pos = position
        self.Damage = damage

    def Attack(self, target):
        self.CurrentTarget = target
        target.Health -= self.Damage
        self.CurrentTarget = None

从我一直在阅读的内容中,我已经将'self'关键字应用于Attack的类定义,并且当调用'p1.Attack(...)'时,应该传递'p1' ,但由于某种原因,我收到了错误:

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

有关我缺少什么的任何建议?我知道有一些关于同一问题的相关问题,但这些问题解释了为什么需要'self',我已经(有点)得到了。

2 个答案:

答案 0 :(得分:1)

尝试像这样定义你的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

相同的操作

答案 1 :(得分:0)

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

问题是我在运行main.py文件的目录中编译了python文件 - 反过来,当python执行时,它指的是这些编译的.pyc文件而不是我的实际脚本文件正在编辑。

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

感谢大家的投入!