Python调用类方法时参数数量错误

1 投票
5 回答
2812 浏览
提问于 2025-04-15 21:34

我刚开始学习Python。我写了一个示例脚本来测试Python中的面向对象编程,但发生了一些奇怪的事情。当我调用一个类的方法时,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 个回答

3

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

b) 在第4行,你是在给自己赋值。也许你想写的是self.num1和self.num2。

c) 如果你想调用t的foo方法(在第14和第20行),你需要在后面加上括号:t.foo()。

d) 缩进通常用4个空格,这样阅读起来会更轻松。

编辑:你可能想看看Allen Downey的书《Think Python: How to Think Like a Computer Scientist》的第15到18章。这本书很短,写得很好,容易理解。可以在这里免费获取。

编辑2:我之前没注意到,但正如dash-tom-bang在下面的评论中指出的,在这种情况下,最好在第8行使用==来比较相等,而不是is。

7

实例方法的第一个参数就是这个实例本身。通常在定义这个函数的时候,我们会把它叫做 self

  def __init__(self, num1, num2):

你可以考虑阅读 这个教程

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. ^ 这个符号是布尔异或运算符。不是很确定这是不是你想要的,它常常和幂运算符 ** 混淆。

这是你的例子,已经整理和修正过了:

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 !

撰写回答