Использование getattr для вызова функции в отдельном классе

Возможно, я пытаюсь сделать что-то, что находится за пределами возможной области, но я решил, что сначала спрошу, прежде чем оставить надежду. Так что вот так...

У меня есть 2 класса, A и B. Каждый класс имеет произвольное количество функций. Класс B будет создан где-то в классе A, а класс A будет использовать одну из функций класса B посредством этого экземпляра. Функция в классе B должна ссылаться на одну или несколько функций класса A, используя текущие данные создания экземпляров класса A.

Класс А

#!/usr/bin/python
from classB import classB


class classA(object):
    def Apple(self):
        print("Inside Apple")
        b = classB()
        b.Banana()
        b.bar()

    def foo(self): 
        print("foo inside apple")


a = classA()
a.Apple()

Класс Б:

#!/usr/bin/python
import inspect


class classB(object):
    def Banana(self):
        print("Inside banana")

    def bar(self):
        print("bar inside banana")

        ''' 
        The following lines just show I can get the names of the
        calling class and methods.
        '''
        stack = inspect.stack()
        the_class = stack[1][0].f_locals["self"].__class__
        the_method = stack[1][0].f_code.co_name
        print("Caller Class: {}".format(the_class))
        print("Caller Method: {}".format(the_method))

        function_name = 'foo'
        if hasattr(the_class, function_name):
            print("Class {} has method {}".format(the_class, 
            function_name))
            getattr(the_class, function_name)()

Я получаю следующую ошибку:

getattr (the_class, имя_функции) ()

TypeError: необязательный метод foo() должен быть вызван с экземпляром classA в качестве первого аргумента (вместо этого ничего не получил)

Спасибо!

1 ответ

Решение

Как следует из ошибки, вы должны построить объект класса A (т.е. the_class) перед вызовом getattr.

objA = the_class()

Но, сделав шаг назад, почему бы вам не передать класс A классу B при его инициализации?

b = classB(self)

Это позволит вам получить доступ к нужному методу класса А.

Иначе, если метод 'foo' в классе A должен быть статическим методом, сделайте это с помощью @staticmethod декоратор.

Другие вопросы по тегам