我刚开始学习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)
有人可以帮忙吗? 提前致谢
答案 0 :(得分:7)
答案 1 :(得分:5)
夫妻俩:
Bar
,但您将其称为bar(a, b)
。将其更改为Bar(a, b)
以解决此问题。object
)。您需要class Bar(object):
def __init__(num1, num2):
应为def __init__(self, num1, num2):
,而def foo()
则相同。self.
为前缀。因此num1
应为self.num1
等。^
运算符是布尔值XOR。不确定这是否是你想要的,它经常与权力运算符**
混淆。以下是您的示例,清理并相应修复:
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
,但没有任何东西阻止你将其命名为其他任何东西。