Python中面向对象的示例

时间:2013-12-23 06:41:41

标签: python

我知道它的愚蠢问题,但我试图掌握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的概念。我做错了什么?

3 个答案:

答案 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个部分。