使用getattr在单独的类中调用函数

时间:2018-03-21 06:51:19

标签: python python-2.7 class getattr hasattr

我可能会尝试在这里做一些超出可能性范围的事情,但我想我会在放弃希望之前先问一下。所以这就是......

我有2个类,A和B.每个类都有任意数量的函数。 B类将在A类中的某个地方实例化,而A类将通过该实例化利用B类功能之一。 B类中的函数需要使用它的当前A类实例化数据来引用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()

B类:

#!/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,function_name)()

     

TypeError:必须使用classA实例作为第一个参数调用未绑定方法foo()(没有任何内容)

谢谢!

1 个答案:

答案 0 :(得分:2)

如错误所示,您必须在调用getattr之前构建 classA (即the_class)的对象。

objA = the_class()

但退后一步,为什么不在初始化时将A级传递给B级?

b = classB(self)

这将允许您访问所需的A类确切方法。

否则,如果方法' foo'在类A中应该是一个静态方法,使用@staticmethod装饰器来实现它。