Использование 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
декоратор.