2016-06-07 2 views
-2

У меня есть класс и я пытаюсь создать функцию внутри функции в классе. Мой код заключается в следующем:Вызов функции внутри функции в python3

class example: 
    def __init__(self): 
     self.points = 0 
    def operations(self): 
     def add(self): 
      self.points += 1 
     def subtract(self): 
      self.points -= 1 
    def display(self): 
     print(self.points) 

obj = example() 
obj.display() 
obj.operations.add() 

я получить выход , а затем получить ошибку:

obj.operations.add() 
AttributeError: 'function' object has no attribute 'add' 

Я пробовал много других способов решить эту проблему, но никто из них не работал. Ответьте, если вы знаете, как исправить эту ошибку.

-Спасибо

+0

Что именно вы пытаетесь сделать? Вы можете определять функции внутри функций, но они не будут доступны через 'function1.function2'. Особенно они даже не существуют, пока вы не выполняете функцию (и если вы не «сохраните» функции после этого, они перестанут существовать). – syntonym

+1

Функции внутри функций - это * locals *, как и любая другая переменная в функции. Они существуют только во время вызова функции, а не вне этого вызова. По какой-то причине вы хотели пропустить эти функции? –

+0

@MartijnPieters Причина, по которой у меня есть функция внутри функции A, заключается в том, что в моей реальной программе у меня много программ, и я человек, который любит держать вещи аккуратными. – Nic

ответ

-2

вы можете попробовать возвращения функции из функции, то использовать их что-то вроде этого -

class example: 
    def __init__(self): 
     self.points = 0 
    def operations(self): 
     def add(): 
      print "add is called" 
      self.points += 1 
     def subtract(): 
      self.points -= 1 
     return [add, subtract] 
    def display(self): 
     print(self.points) 

obj = example() 
obj.display() 
obj.operations()[0]() 
obj.display() 

Если вы специально хотите сделать это с obj.operations.add() вы можете попробовать агрегацию таким образом (это включает использование переменной класса, если это нормально с вами)

class example: 
    points = 0 
    def __init__(self): 
     example.points = 0 
     self.operations = Operations(self) 

    def display(self): 
     print(self.points) 

class Operations(example): 
    def __init__(self, ex): 
     self.points = ex.points 

    def add(self): 
     print "add is called" 
     example.points += 1 
    def subtract(self): 
     example.points -= 1 

obj = example() 
obj.display() 
obj.operations.add() 
obj.display() 
obj.operations.subtract() 
obj.display() 

надеюсь, что это может помочь!

+0

Мне бы хотелось пойти «obj.operations.add()». Но тем не менее, ваш путь работает, и я буду использовать этот путь, если не могу найти другого пути. Благодаря! – Nic

+0

Если вы вернете именованный кортеж, вы можете получить obj.operations(). Add. И если операции - это свойство, которое возвращает именованный кортеж, у вас будет obj.operations.add. Но ... не делай этого. – syntonym

+0

Пример класса работал! Благодаря! – Nic

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