我知道它的愚蠢问题,但我试图掌握Python中OOP的概念。假设我想以程序形式编写阶乘程序,我会做这样的事情
def factorial(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
f = factorial(3)
print f # 6
现在我想用OO方式重写相同的阶乘程序。我没有得到如何使用对象和类编写这个相同的函数。
class Factorial():
def fact(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
f = Factorial()
a = f.fact(3)
print a # TypeError: fact() takes exactly 1 argument (2 given)
我知道这可以通过 lambdas 等方式以功能方式更精确地完成,但我正在学习OOP的概念。我做错了什么?
答案 0 :(得分:3)
当您调用实例方法时,默认情况下,当前对象作为第一个参数传递给函数。在你的情况下,
def fact(n):
当你这样打电话时
a = f.fact(3)
它实际上会像这样对待
a = fact(f, 3)
传递当前对象的原因是,让实例方法对对象进行更改。 (请记住,Python没有像this
这样的任何其他关键字,就像在其他一些语言中一样。)
但是你的函数的签名与此不匹配(它只需要一个参数)。这就是它投掷的原因
# TypeError: fact() takes exactly 1 argument (2 given)
要解决此问题,您必须将签名更改为此类
def fact(self, n):
现在,self
参数将接收当前传递的对象。
答案 1 :(得分:2)
您忘记了self
参数:
class Factorial():
def fact(self,n): #Forgot the self parameter huh?
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
我建议你也阅读这些内容:
答案 2 :(得分:1)
我还建议阅读这些文章:
An Introduction to Object-Oriented Concepts in Python, Part 1
不幸的是我不能把更多的2个链接但是我相信你会发现其他4个部分。