python3尝试使用d获取带有functionreference的methodvariable

2024-06-01 03:45:51 发布

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

我使用的是python3.5,我试图用Python decorator打印函数调用的数量。下面是我的例子:

import inspect
def logWrapper(func):
  def wrapper_func(self, *args, **kwargs):
    wrapper_func.calls += 1
    self.logger.info('Func: {}' .format(func.__name__) )
    return func(self, *args, **kwargs)
  wrapper_func.calls=0

  return wrapper_func


class A:

  __init__(self):
    print('created')

  @logWrapper
  def myfunction1(self, var1):
    print('var1: {}' .format(var1))

  @logWrapper
  def myfunction2(self, var2):
    print('var2: {}' .format(var2))  

if __name__ == "__main__":   
  Pal1=A()
  Pal1.myfunction1('1')
  Pal1.myfunction1('2')
  Pal1.myfunction1('3')
  Pal1.myfunction2('A')

  function_list=inspect.getmembers(Pal1, predicate=inspect.ismethod)
  for func in function_list:
    method_to_call = getattr(A, func[0])
    print( 'Function: {}; Calls: {}' .format(func[0], method_to_call.calls))

当我调用Pal1.myfunction1.callsPal1.myfunction2.calls时,我得到了正确的结果3和1。但是现在我喜欢迭代抛出类A的每个函数。当我尝试Pal1.func[0].calls时,我得到了错误消息*** AttributeError: 'A' object has no attribute 'func',我也尝试了A.method_to_call.calls,得到了相同的结果

我做错了什么


Tags: selfformatdefwrappermethodfuncprintinspect
1条回答
网友
1楼 · 发布于 2024-06-01 03:45:51

问题是您将实例方法作为类方法调用

例如,你不能打电话

A.myfunction1('3')

不管你怎么打

inst = A()
inst.myfunction1('3')

当这被翻译成getattr语法时,您的代码就变成

method_to_call = getattr(Pal1, func[0])

相关问题 更多 >