Skip to main content
 首页 » 编程设计

python之Python 中的面向对象示例

2025年05月04日16daizhj

我知道这是个愚蠢的问题,但我正试图掌握 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 参数将接收当前传递的对象。