0

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

我有 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:未绑定的方法 foo() 必须以 classA 实例作为第一个参数来调用(反而什么都没有)

谢谢!

4

1 回答 1

2

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

objA = the_class()

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

b = classB(self)

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

@staticmethod否则,如果类 A 中的方法 'foo' 应该是静态方法,请使用装饰器使其成为静态方法。

于 2018-03-21T07:03:48.363 回答