我知道这是个愚蠢的问题,但我正试图掌握 Python 中 OOP 的概念。假设我想以过程形式编写阶乘程序,我会做这样的事情
def factorial(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
f = factorial(3)
print f # 6
现在我想用面向对象的方式重写同一个阶乘程序。我不知道如何使用对象和类编写相同的函数。
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 和其他东西以 Functional 的方式更精确地完成,但我正在学习 OOP 的概念。我做错了什么?
请您参考如下方法:
当您调用实例方法时,默认情况下当前对象作为第一个参数传递给函数。在你的情况下,
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 参数将接收当前传递的对象。
