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