2013-12-23 3 views
1

Я знаю его немой вопрос, но я пытаюсь понять концепции ООП в Python. Предположу, что я хочу написать программу для факториала в процессуальной формы, я бы что-то вроде этогоОбъектно-ориентированный пример в Python

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) 

Я знаю, что это может быть сделано более точно в Functional способом, используя лямбды и другие вещи, но я учусь концепции объектно-ориентированного программирования. Что я делаю неправильно?

ответ

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 получит текущий объект передается.

+0

Удивительное объяснение, спасибо. – ajkumar25

+0

@ user3012137 Добро пожаловать :) Пожалуйста, подумайте о принятии этого ответа, если он вам поможет http://meta.stackexchange.com/a/5235/235416 – thefourtheye

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 

Я рекомендую вам прочитать их тоже:

+0

Ух, я понял. Это ** я ** вещь сбивает с толку. – ajkumar25

+0

Также может потребоваться рассмотреть: class Factorial (Object): он работает, не делая этого. – Tony

+0

@ user3012137 ikr, Отправленные некоторые ссылки обязательно проверьте их ... –

Смежные вопросы