Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过检查获取类静态方法的类名_Python_Inspection - Fatal编程技术网

Python 如何通过检查获取类静态方法的类名

Python 如何通过检查获取类静态方法的类名,python,inspection,Python,Inspection,我发现了同样相似的问题,但我的问题不同 def trace (): ? class A(): @staticmethod def Aha(): trace () ... 我想要跟踪输出 A.Aha()被调用 我已经知道如何通过检查得到函数名,并得到instance.method的类名,如下: self_argument = frame.f_code.co_varnames[0] # This *should* be 'self'. instance = f

我发现了同样相似的问题,但我的问题不同

def trace ():
   ?

class A():
  @staticmethod
  def Aha():
     trace ()
     ...
我想要跟踪输出

A.Aha()被调用

我已经知道如何通过检查得到函数名,并得到
instance.method
的类名,如下:

self_argument = frame.f_code.co_varnames[0]  # This *should* be 'self'.
instance = frame.f_locals[self_argument]
class_name = instance.__class__.__name__

但是类静态方法没有自参数,我应该怎么做?

这正是静态方法的定义:在没有类参数(如在类方法中)和没有实例参数(如在实例方法中)的情况下调用它。在模块作用域中声明的函数与静态方法之间唯一的真正区别在于,方法名称是在类的命名空间中定义的,而不是在模块的命名空间中定义的

换句话说,您不能直接访问类对象。您可以通过检查堆栈来获得函数名(尽管我不确定它有多有用):

给定名称,您可以通过从名称中提取并在模块的命名空间中查找来访问类对象

供参考:

第@-1帧:调用traceback.extract_stack()
第@-2帧:调用trace()

frame@-3:调用A.A()

您可以尝试为
Aha
创建包装器/装饰器。我建议你读一读,如果你不知道装饰师是

类似下面的内容应该打印出函数名,然后调用函数

def wrapper(func):
    def inner(*args, **kwargs):
        print("function {0} has been called".format(func.__name__))
        return func(*args, **kwargs)
    return inner

@wrapper
def f():
   print "I'm in the function
返回

In [16]: f()
function f has been called
in the function

这似乎适得其反。你想解决的问题是什么?3是什么意思?你能给我一些文件吗?我可以使用inspect.get。。做同样的事情吗,-3是帧列表末尾的第三个条目,3是帧本身的第三个字段。。。不要忘记接受答案,如果它是你想要的:)谢谢你的答案,但我需要的是如果类名,而不仅仅是函数名。ups,我错过了一个细节,对不起。我认为可以以类作为输入构建包装器,然后打印类名
In [16]: f()
function f has been called
in the function