Python 检查方法是否为类方法和调用属性
我构建了一个用于日志记录的小装饰器Python 检查方法是否为类方法和调用属性,python,class,object,decorator,python-decorators,Python,Class,Object,Decorator,Python Decorators,我构建了一个用于日志记录的小装饰器 def func_detail(func): def func_wrapper(*args,**kwargs): log(func.__name__+' ARGS: {}'.format(str(args))) return func(*args,**kwargs) return func_wrapper 这适用于对象方法和普通方法。我想在多线程中使用它。我有一个类,它包含pid作为对象属性。如果检测到该方法属
def func_detail(func):
def func_wrapper(*args,**kwargs):
log(func.__name__+' ARGS: {}'.format(str(args)))
return func(*args,**kwargs)
return func_wrapper
这适用于对象方法和普通方法。我想在多线程中使用它。我有一个类,它包含pid
作为对象属性。如果检测到该方法属于某个类并且该类包含属性pid
,是否可以将decorator更改为log
pid
我试过:
def func_detail(func):
def func_wrapper(*args,**kwargs):
log('PID: '+self.pid if self.pid is not None else ' '+func.__name__+' ARGS: {}'.format(str(args)))
return func(*args,**kwargs)
return func_wrapper
但这根本不起作用。你能帮我吗
摘要:
我希望能够从方法(
func
)所在的类调用属性pid
属于而不将self
作为参数传递给包装器,因为在这种情况下,它不适用于不在类内的方法。方法的self
参数不会神奇地提供给装饰器中的func\u包装器
函数。相反,它将是您使用*args
捕获的第一个位置参数。如果要使用它,需要检查args[0]
并查看它是否具有pid
属性
尝试此操作,首先检查第一个参数是否存在,然后检查它是否具有pid
属性:
log('{}FUNC: {} ARGS: {}'.format('PID: {} '.format(args[0].pid)
if args and hasattr(args[0], "pid") else '',
func.__name__, args))
方法的self
参数不能神奇地被decorator中的func\u包装器
函数使用。相反,它将是您使用*args
捕获的第一个位置参数。如果要使用它,需要检查args[0]
并查看它是否具有pid
属性
尝试此操作,首先检查第一个参数是否存在,然后检查它是否具有pid
属性:
log('{}FUNC: {} ARGS: {}'.format('PID: {} '.format(args[0].pid)
if args and hasattr(args[0], "pid") else '',
func.__name__, args))
方法的self
参数不能神奇地被decorator中的func\u包装器
函数使用。相反,它将是您使用*args
捕获的第一个位置参数。如果要使用它,需要检查args[0]
并查看它是否具有pid
属性
尝试此操作,首先检查第一个参数是否存在,然后检查它是否具有pid
属性:
log('{}FUNC: {} ARGS: {}'.format('PID: {} '.format(args[0].pid)
if args and hasattr(args[0], "pid") else '',
func.__name__, args))
方法的self
参数不能神奇地被decorator中的func\u包装器
函数使用。相反,它将是您使用*args
捕获的第一个位置参数。如果要使用它,需要检查args[0]
并查看它是否具有pid
属性
尝试此操作,首先检查第一个参数是否存在,然后检查它是否具有pid
属性:
log('{}FUNC: {} ARGS: {}'.format('PID: {} '.format(args[0].pid)
if args and hasattr(args[0], "pid") else '',
func.__name__, args))
如果调用方法,对象本身将是方法实现中的第一个参数self
如果您的decorator仅应用于方法(定义为def methodName(self,…):
),则可以捕获self中的第一个参数
然后,您可以尝试打印self.pid并捕获异常(如果没有任何此类属性)
因为自由函数和方法之间没有什么区别,所以我认为应该定义两个decorator,一个用于自由函数,另一个用于方法,或者定义一个decorator,使用一个参数表示它是否是方法
另一种解决方案是检查args是否为空,并打印args[0]。如果存在则为pid。如果调用方法,则对象本身将是方法实现中的第一个参数,即self
如果您的decorator仅应用于方法(定义为def methodName(self,…):
),则可以捕获self中的第一个参数
然后,您可以尝试打印self.pid并捕获异常(如果没有任何此类属性)
因为自由函数和方法之间没有什么区别,所以我认为应该定义两个decorator,一个用于自由函数,另一个用于方法,或者定义一个decorator,使用一个参数表示它是否是方法
另一种解决方案是检查args是否为空,并打印args[0]。如果存在则为pid。如果调用方法,则对象本身将是方法实现中的第一个参数,即self
如果您的decorator仅应用于方法(定义为def methodName(self,…):
),则可以捕获self中的第一个参数
然后,您可以尝试打印self.pid并捕获异常(如果没有任何此类属性)
因为自由函数和方法之间没有什么区别,所以我认为应该定义两个decorator,一个用于自由函数,另一个用于方法,或者定义一个decorator,使用一个参数表示它是否是方法
另一种解决方案是检查args是否为空,并打印args[0]。如果存在则为pid。如果调用方法,则对象本身将是方法实现中的第一个参数,即self
如果您的decorator仅应用于方法(定义为def methodName(self,…):
),则可以捕获self中的第一个参数
然后,您可以尝试打印self.pid并捕获异常(如果没有任何此类属性)
因为自由函数和方法之间没有什么区别,所以我认为应该定义两个decorator,一个用于自由函数,另一个用于方法,或者定义一个decorator,使用一个参数表示它是否是方法
另一种解决方案是检查参数是否为空,并打印参数[0].pid(如果存在)。您说它不起作用。你的意思是你得到了一个属性错误?如果没有,请解释。@kobejohn例如,只需打印-print self.pid NameError:未定义全局名称“self”,因为decorator不知道它将用于对象方法。它也可以在函数外部使用。Y