Python调用类方法时参数数量错误
我刚开始学习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
5
几点事情:
- 你的类叫做
Bar
,但你在调用的时候用的是bar(a, b)
。把它改成Bar(a, b)
,这样就能解决这个问题。 - 类需要继承自某个东西(如果没有,那就继承自
object
)。你需要写成class Bar(object):
。 - 在Python中,实例方法总是会自动传入一个参数,这个参数就是对象本身,其他参数在后面。所以你的
def __init__(num1, num2):
应该改成def __init__(self, num1, num2):
,同样的,def foo()
也要这样改。 - 你所有的实例变量都需要加上
self.
前缀。所以num1
应该改成self.num1
,等等。 -
^
这个符号是布尔异或运算符。不是很确定这是不是你想要的,它常常和幂运算符**
混淆。
这是你的例子,已经整理和修正过了:
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 !