Python调用具有错误参数数量的类方法

时间:2010-04-13 22:59:04

标签: python oop parameters methods

我刚开始学习python。我编写了一个示例脚本来测试python中的OOP,但是发生了一些非常奇怪的事情。当我调用类方法时,Python使用的参数多于给定的参数。

以下是代码:


1.  class Bar:
2.   num1,num2 = 0,0
3.   def __init__(num1,num2):
4.    num1,num2 = num1,num2
5.   def foo():
6.    if num1 > num2:
7.     print num1,'is greater than ',num2,'!'
8.    elif num1 is num2:
9.     print num1,' is equal to ',num2,'!'
10.   else:
11.    print num1,' is less than ',num2,'!'
12. a,b = 42,84
13. t = Bar(a,b)
14. t.foo
15. 
16. t.num1 = t.num1^t.num2
17. t.num2 = t.num2^t.num1
18. t.num1 = t.num1^t.num2
19. 
20. t.foo

我得到的错误信息:
  


python test.py
Traceback (most recent call last):
  File "test.py", line 13, in 
t = Bar(a,b)
TypeError: init() takes exactly 2 arguments (3 given) 

有人可以帮忙吗? 提前致谢

5 个答案:

答案 0 :(得分:7)

传递给实例方法的第一个参数是实例本身。通常,在定义函数时,这称为self

  def __init__(self, num1, num2):

考虑阅读the tutorial

答案 1 :(得分:5)

夫妻俩:

  1. 您的课程名为Bar,但您将其称为bar(a, b)。将其更改为Bar(a, b)以解决此问题。
  2. 类需要从某些东西继承(如果没有,那么object)。您需要class Bar(object):
  3. 在Python中,实例方法总是在其他传递参数之前提供一个参数,即对象本身。因此,def __init__(num1, num2):应为def __init__(self, num1, num2):,而def foo()则相同。
  4. 所有实例变量都需要以self.为前缀。因此num1应为self.num1等。
  5. ^运算符是布尔值XOR。不确定这是否是你想要的,它经常与权力运算符**混淆。
  6. 以下是您的示例,清理并相应修复:

    class Bar(object):
        num1, num2 = 0, 0
        def __init__(self, num1, num2):
            self.num1, self.num2 = num1, num2
    
        def foo(self):
            if self.num1 > self.num2:
                print self.num1,'is greater than ',self.num2,'!'
            elif self.num1 is self.num2:
                print self.num1,' is equal to ',self.num2,'!'
            else:
                print self.num1,' is less than ',self.num2,'!'
    
    a, b = 42, 84
    t = Bar(a, b)
    t.foo()
    
    t.num1 = t.num1 ^ t.num2
    t.num2 = t.num2 ^ t.num1
    t.num1 = t.num1 ^ t.num2
    
    t.foo()
    

    结果:

    42  is less than  84 !
    84 is greater than  42 !
    

答案 2 :(得分:3)

a)按照惯例,方法的第一个参数称为self。

b)在第4行,你是自我分配的。也许你想说self.num1,self.num2

c)如果你想调用t的方法foo(第14行和第20行),你应该在末尾添加括号:t.foo()

d)缩进由4个空格惯用,这使得阅读更容易。

编辑:你可能想看看艾伦唐尼的书“思考Python:如何像计算机科学家一样思考”中的第15-18章。这本书非常简短,写得很好,而且易于阅读。它是免费提供的here

EDIT2:我以前没有注意到这一点,但正如下面的评论中指出的那样,在这种情况下,最好是(在第8行)使用==而不是is来比较相等性。

答案 3 :(得分:1)

Python标识符区分大小写... bar!= Bar ...

此外,您需要将self显式声明为__init__()方法的第一个参数,例如:

def __init__(self, num1, num2):
   #...etc.
BTW,请参阅bcherry的回答,因为他/她涵盖了其他典型的Python初学者错误(例如没有用self.明确地为实例变量添加前缀......

答案 4 :(得分:1)

关于那个特定的错误消息,你错过了第3行的self参数。它应该是:

def __init__(self, num1,num2):

与其他OOP语言中的实例方法不同,在Python中,您必须在定义此类方法时将实例明确命名为第一个参数。然后,当您致电obj.some_method()时,obj会自动隐式地作为第一个参数传递给some_method

第一个参数是惯用的self,但没有任何东西阻止你将其命名为其他任何东西。