2015-03-22 3 views
1

В Python 2.7 У меня есть такое определение класса:Как использовать функцию внутри класса __init__ функции

class foo: 
    def __init__(self,ahg): 
     self.ahg=ahg 
     def oaf(arg): 
      return arg*2 
     self.tooAhg=self.oaf(self.ahg) 

В консоли я делаю следующие утверждения

>>> bibi=foo(1) 
>>> vars(bibi) 
{'ahg': 1} 

Я не знаю, почему vars(bibi) не возвращается {'ahg': 1, 'tooAhg': 2}. Пожалуйста помоги! Кроме того, еще одна неудачная стратегия заключается в следующем:

class foo: 
    def __init__(self,ahg): 
     self.ahg=ahg 
     self.tooAhg=self.oaf() 
    def oaf(self): 
     return self.ahg*2 
+1

Ваш второй пример работает для меня ... Кроме того, обычно не всегда полезно размещать функции внутри функций. – Zizouz212

+2

@ Zizouz212 обертывание функции в другой функции НЕ является необычным - в модуле [functools] есть несколько примеров (https://docs.python.org/2.7/library/functools.html#functools.partial) и [декораторы ] (https://wiki.python.org/moin/PythonDecoratorLibrary) довольно полезны. – wwii

+0

@ Zizouz212 - Мне не очень нравится определять функцию внутри другой функции. Но я не вижу причин не вызывать функцию из другой функции. – EricVonB

ответ

3

Если вы прочитали сообщение об ошибке из первого примера то, что мог бы дать вам подсказку.

self.tooAhg=self.oaf(self.ahg) 
AttributeError: foo instance has no attribute 'oaf' 

Название Функция oaf, не self.oaf.

class foo: 
    def __init__(self,ahg): 
     self.ahg=ahg 
     def oaf(arg): 
      return arg*2 
     self.tooAhg=oaf(self.ahg) 

bibi=foo(1) 
print vars(bibi) 

Дает:

{'tooAhg': 2, 'ahg': 1} 

Если вы хотите, чтобы сделать функцию oaf атрибут объекта, то:

self.oaf = oaf 
+0

Хорошо, я принимаю этот код. Он исправляет ошибку в моей программе. Спасибо. – EricVonB

+0

@ EricVonB: тогда вы могли бы проверить мой ответ как решение? – cdarke

1

Не уверен, если это соответствует вашему потребительной случай, но если tooAhg должно быть 2*ahg всегда, вы должны использовать свойства:

class Foo(object): 
    def __init__(self, ahg): 
     self.ahg = ahg 

    @property 
    def tooAhg(self): 
     return 2 * self.ahg 

Теперь вы можете получить доступ к tooAhg, как и к любому другому классу (например, self.tooAhg), не беспокоясь о его обновлении всякий раз, когда вы обновляете ahg

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