当前位置: 首页 > 面试题库 >

如何在python中另一个类的函数中获取调用者类名称?

通鸿风
2023-03-14
问题内容

我的目标是为此激发一个应用程序的时序图,我需要在运行时提供有关调用方和被调用方类名称的信息。我可以成功检索调用者函数,但无法获得调用者类名称吗?

#Scenario caller.py:

import inspect

class A:

    def Apple(self):
        print "Hello"
        b=B()
        b.Bad()



class B:

    def Bad(self):
        print"dude"
        print inspect.stack()


a=A()
a.Apple()

当我打印堆栈时,没有有关调用程序类的信息。那么有可能在运行时检索调用方类吗?


问题答案:

好吧,在按提示进行了一些挖掘之后,这是我得到的:

stack = inspect.stack()
the_class = stack[1][0].f_locals["self"].__class__.__name__
the_method = stack[1][0].f_code.co_name

print("I was called by {}.{}()".format(the_class, the_method))
# => I was called by A.a()

调用时:

➤ python test.py
A.a()
B.b()
  I was called by A.a()

给定文件test.py

import inspect

class A:
  def a(self):
    print("A.a()")
    B().b()

class B:
  def b(self):
    print("B.b()")
    stack = inspect.stack()
    the_class = stack[1][0].f_locals["self"].__class__.__name__
    the_method = stack[1][0].f_code.co_name
    print("  I was called by {}.{}()".format(the_class, the_method))

A().a()

不知道从其他对象调用该对象时的行为。



 类似资料:
  • 问题内容: 如果您有两个功能,例如: 并且A呼叫B,您能知道谁在B内部呼叫B时,例如: 问题答案: 您可以使用检查模块获取所需的信息。它的堆栈方法返回帧记录列表。 对于 Python 2, 每个帧记录都是一个列表。每个记录中的第三个元素是呼叫者名称。您想要的是: def f(): … print inspect.stack()[1][3] … def g(): … f() … g() g 对于 P

  • 这里Book是根类,即最终的CSV将命名为books.CSV。 使用,我们只获得字段名title和author,但是我们还需要来自author类的字段名(name和age),有没有方法获得这些字段名?

  • 我不明白为什么下面的代码会打印两次。我以为应该是个人和学生。当通过“a”对象调用printPerson()内部的getInfo()时,为什么要调用Person类内部的一个,为什么不调用Student类中的一个?提前谢谢。

  • 问题内容: 在这件事上,我需要一些帮助, 例: 基本上是这种情况。我的问题是方法如何知道谁在调用它? 编辑:基本上我正在尝试做一个数据库层,并且在我将创建一种将生成SQL语句的方法。通过获取调用的所有属性的值来动态生成此类语句。 问题答案: 最简单的方法如下: 但实际上,除非出于某些日志记录目的,否则不需要这样做,因为这是一项相当昂贵的任务。这是什么,你认为这是解决方案?我们可能会提出更好的建议。

  • 问题内容: 我认为以下伪代码很好地总结了我的问题… 由(拥有)拥有(拥有适当的字词?)。那么对象类型将如何调用? 起初我在想,但这是针对继承的类的。然后我想通过一个接口,我走对了吗? 问题答案: 如果dostuff是常规方法,则需要将Bar传递给实例。 请注意,Bar可能有很多所有者,但没有任何现实的方法来确定他们是谁。 编辑:您可能正在寻找内部类:示例和注释。

  • 我有一个类Main(它具有公共静态void Main(String[]args))和另一个类MyDocument。 Main类中存在一个变量,我想从MyDocument类中的函数alphabetOccurrence()访问该变量。我该怎么做呢?我不想用它作为静态变量。任何修改只能在函数中进行,其余的代码应该保持不变。