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

2024-04-26 17:46:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

def trace ():
   ?

class A():
  @staticmethod
  def Aha():
     trace ()
     ...

我要跟踪输出

A.Aha() was called

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

^{pr2}$

但是类静态方法没有自变量,我该怎么办?在


Tags: instance函数deftracemethodclassahawas
2条回答

您可以尝试为Aha创建包装器/装饰器。我建议您阅读this和{a2},如果您不知道装饰器是。在

下面这样的代码应该打印出函数名,然后调用函数。在

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

退货

^{pr2}$

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

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

>>> import sys
>>> import traceback
>>> class A(object):
        @staticmethod
        def a():
            trace()
>>> def trace():
        print traceback.extract_stack(sys._getframe())[-3][3]
>>> A.a()
A.a()

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

供参考:

帧@-1:调用traceback.extract_堆栈()
帧@-2:调用trace()
帧@-3:调用A.A()

相关问题 更多 >