Вложенная функция Python вызывает другую функцию в классе

#python-3.x

#python-3.x

Вопрос:

У меня есть класс

 class AClass():
    def a(self):
       ... code ...
    def b(self):
       ... code ...
    def c(self):
       def d():
           ... call a() ...
           ... call b() ...
       ... call d() ...
  

Как я могу вызвать функции a и b из функции d c?

Комментарии:

1. self.a self.b Не сработало?

2. нет, не работает. не удается объявить d как «def d(self):»

3. вам не нужно объявлять d как def d(self) вызывающий d() внутри метода c, когда у d есть a(), а b() — это то же самое, что вызывать a() и b() .

4. Я не объявлял d как def d(self): но также я не могу вызвать a и b из d . когда я запускаю приложение в режиме отладки с точкой останова, оно вызывает a и b . но когда я запускаю приложение без точки останова, оно не запускает ни a, ни b.

5. Я могу вызвать a() и b(), используя self.a() и self.b() . Конечно, я просто использую фиктивный класс, так что, вероятно, это совсем другая проблема?

Ответ №1:

 class AClass():
    def a(self):
       print('A')
    def b(self):
       print('B')
    def c(self):
       def d():
           self.a()    # because 'self' is defined in the enclosing scope...
           self.b()    # ...it's valid to use within our definition of d()
       d()
  

Обратите внимание, что определение функции d() переоценивается и перекомпилируется по существу при каждом запуске c() *. Как и любая другая функция, переменные, определенные во включающей области, допустимы для использования, поэтому мы можем вызывать методы для self того, что было передано в C:

 >>> inst = AClass()
>>> inst.c()
A
B
  

Как мы можем видеть, оба a() и b() были вызваны успешно.


* Это сложнее, но процесс компиляции точно в срок в python выходит за рамки этого ответа

Комментарии:

1. Это то, что я получаю, выполняя свой собственный тест, может быть, проблема OP заключается не только в этой реализации?