如何在Python 3.1中的类构造中找到绑定方法的类?

flo*_*low 5 python python-3.x

我想写一个装饰器,使类的方法可以被其他方看到; 然而,我所描述的问题与该细节无关.代码看起来大致如下:

def CLASS_WHERE_METHOD_IS_DEFINED( method ):
  ???

def foobar( method ):
  print( CLASS_WHERE_METHOD_IS_DEFINED( method ) )

class X:

  @foobar
  def f( self, x ):
    return x ** 2
Run Code Online (Sandbox Code Playgroud)

我的问题在于装饰foobar()者看到方法的那一刻,它还无法调用; 相反,它可以看到它的未绑定版本.也许这可以通过在类上使用另一个装饰器来解决,该装饰器将处理对绑定方法必须做的任何事情.我将尝试做的下一件事是在装饰方法通过装饰器时简单地使用属性标记,然后使用类装饰器或元类来进行后处理.如果我得到这个工作,那么我不必解决这个谜语,这仍然让我困惑:

任何人都可以在上面的代码中填写有意义的行,CLASS_WHERE_METHOD_IS_DEFINED以便装饰器可以实际打印出f定义的类,它被定义的那一刻?或者在python 3中排除了这种可能性?

Ale*_*lli 7

当装饰器被调用时,它被调用一个函数作为它的参数,而不是一个方法 - 因此它不会对装饰器进行任何检查和内省它的方法,因为它只是一个函数并且不携带任何信息关于封闭阶级的任何内容.我希望这能解决你的"谜语",尽管在消极意义上!

可能会尝试其他方法,例如对嵌套堆栈帧的深入内省,但它们很容易破解,并且肯定不会延续到Python 3的其他实现,例如pynie; 因此,我衷心建议避免使用它们,支持您已经考虑过的类装饰解决方案,并且更清洁,更稳固.