Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查方法是否为类方法和调用属性_Python_Class_Object_Decorator_Python Decorators - Fatal编程技术网

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