Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Python 3.x_Methods_Inspect - Fatal编程技术网

如何从Python中的方法获取类?

如何从Python中的方法获取类?,python,python-3.x,methods,inspect,Python,Python 3.x,Methods,Inspect,我试图编写一个函数,当我们将给定的方法作为参数传递时,该函数将获取类 例如,如果我们有 同学们好: NAME=你好,托托 def methodself->int: 返回5 @类方法 定义cls_方法cls->str: 回电 早上好: 诺姆=你好 定义新方法自->整数: 返回0 我会得到: 方法Hello.method或Hello.cls\u中的Hello 来自方法的问候问候问候。新的问候方法或问候。cls问候方法 我继续搜索,但找不到我的问题的任何直接答案 如果这很重要,我如何在Python3.

我试图编写一个函数,当我们将给定的方法作为参数传递时,该函数将获取类

例如,如果我们有

同学们好: NAME=你好,托托 def methodself->int: 返回5 @类方法 定义cls_方法cls->str: 回电 早上好: 诺姆=你好 定义新方法自->整数: 返回0 我会得到:

方法Hello.method或Hello.cls\u中的Hello 来自方法的问候问候问候。新的问候方法或问候。cls问候方法 我继续搜索,但找不到我的问题的任何直接答案

如果这很重要,我如何在Python3.6+中实现这样的函数


谢谢

我相信没有什么万无一失的办法,但这在大多数情况下都适用:

def get_class_of_bound_self(f):
    assert hasattr(f, '__self__')
    return f.__self__ if isinstance(f.__self__, type) else type(f.__self__)

注意,如果f是元类M的一个方法,那么这将崩溃;它将返回M而不是type。

我相信没有傻瓜式的方法,但这将适用于大多数情况:

def get_class_of_bound_self(f):
    assert hasattr(f, '__self__')
    return f.__self__ if isinstance(f.__self__, type) else type(f.__self__)

注意,如果f是元类M的一个方法,那么这将崩溃;它将返回M而不是type。

我提供了以下解决方案:

进口检验 def get_classfunc:Callable[…,Any]->Any: 方法的返回类。 Args: func:可调用 返回: 方法的类,如果参数是方法 提出: AttributeError:如果参数不可调用或不是方法 如果不是callablefunc: raise AttributeErrorf{func}应可调用 如果没有,请检查.ismethodfunc: raise AttributeErrorfCallable{func}应是一个方法 第一个参数=func.\u self\u类型:忽略具有self属性的方法 如果inspect.isclassfirst\u arg else first\u arg.\u类,则返回first\u arg__ 最后一行返回first_arg if inspect.isclassfirst_arg else first_arg.\uuuuuu class_uuuuu是处理类方法的情况,在这种情况下,func.\uuu self_uuuu对应于cls,并且是类本身

另一个没有inspect模块的替代方案是捕获异常,这非常感谢@Elazar使用isistance…,键入:

def get_classfunc:Callable[…,Any]->Any: 方法的返回类。 Args: func:可调用 返回: 方法的类,如果参数是方法 提出: AttributeError:如果参数不可调用或不是方法 如果不是callablefunc: raise AttributeErrorf{func}应可调用 尝试: 第一个参数=func.\u self\u类型:忽略具有self属性的方法 除属性错误外: raise AttributeErrorfCallable{func}应是一个方法 cls_或_类型=第一个参数__ 如果是安装cls或类型,则返回第一个参数,然后键入else cls或类型 这是我用来检查您是否感兴趣的代码:

定义我的函数->整数: 感觉像是零 返回0 关于方法[ 你好,方法, 你好,我的方法, Hello.cls_方法, 早上好,cls_法, 你好,新的方法, ]: MyClass=get\u classfunc MyClass=获取类方法 对于[NAME,NOM]中的属性: 打印。。。{method}-{attr}。。。 尝试: printgetattrMyClass,attr 除AttributeError as exp外: 获取属性时的printfError:{exp} 类=获取类我的函数 对于[my_func,int,Hello]中的not_方法: 尝试: MyClass=get\u classnot\u方法 printf{not_method}=>NOK未引发异常 除属性错误外: printf{not_method}=>OK
我提出了以下解决方案:

进口检验 def get_classfunc:Callable[…,Any]->Any: 方法的返回类。 Args: func:可调用 返回: 方法的类,如果参数是方法 提出: AttributeError:如果参数不可调用或不是方法 如果不是callablefunc: raise AttributeErrorf{func}应可调用 如果没有,请检查.ismethodfunc: raise AttributeErrorfCallable{func}应是一个方法 第一个参数=func.\u self\u类型:忽略具有self属性的方法 如果inspect.isclassfirst\u arg else first\u arg.\u类,则返回first\u arg__ 最后一行返回first_arg if inspect.isclassfirst_arg else first_arg.\uuuuuu class_uuuuu是处理类方法的情况,在这种情况下,func.\uuu self_uuuu对应于cls,并且是类本身

另一个没有inspect模块的替代方案是捕获异常,这非常感谢@Elazar使用isistance…,键入:

def get_classfunc:Callable[…,Any]->Any: 方法的返回类。 Args: func:可调用 返回: 方法的类,如果参数是方法 提出: AttributeError:如果参数不可调用或不是方法 如果不是callablefunc: raise AttributeErrorf{func}应可调用 尝试: 第一个参数=func.\u self\u类型:忽略具有self属性的方法 除属性错误外: raise AttributeErrorfCallable{func}应为m 方法 cls_或_类型=第一个参数__ 如果是安装cls或类型,则返回第一个参数,然后键入else cls或类型 这是我用来检查您是否感兴趣的代码:

定义我的函数->整数: 感觉像是零 返回0 关于方法[ 你好,方法, 你好,我的方法, Hello.cls_方法, 早上好,cls_法, 你好,新的方法, ]: MyClass=get\u classfunc MyClass=获取类方法 对于[NAME,NOM]中的属性: 打印。。。{method}-{attr}。。。 尝试: printgetattrMyClass,attr 除AttributeError as exp外: 获取属性时的printfError:{exp} 类=获取类我的函数 对于[my_func,int,Hello]中的not_方法: 尝试: MyClass=get\u classnot\u方法 printf{not_method}=>NOK未引发异常 除属性错误外: printf{not_method}=>OK
谢谢我喜欢你的iInstanceSelf,键入~!:。。。但这个论点本身究竟是什么?@让·弗朗索斯特。我简化了它。现在清楚了吗?或者也许我不明白你们的问题。这是很清楚的。如果isinstanceself只是一个输入错误,类型:istead of if isinstanceself_或_cls,类型:[缺少_或_cls]。这个问题被很好地理解并解决了这个问题,尽管我在发布这个问题时有一个解决方案:谢谢。。。我喜欢你的iInstanceSelf,键入~!:。。。但这个论点本身究竟是什么?@让·弗朗索斯特。我简化了它。现在清楚了吗?或者也许我不明白你们的问题。这是很清楚的。如果isinstanceself只是一个输入错误,类型:istead of if isinstanceself_或_cls,类型:[缺少_或_cls]。这个问题被很好地理解并解决了这个问题,尽管我在发布这个问题时实际上有一个解决方案:你的用例是什么?我想知道,因为期望的结果实际上是论点的一部分。你已经有Hello和Bonjour了。等等,你想要一个单一的解决方案来处理classmethods和普通方法吗?为什么?在AFAICT中,您将使用该技术实现单个方法,因此您已经知道您是在类方法中工作还是在普通方法中工作。在classmethod中,传入的cls已经是您需要的类对象;在普通方法中,您可以检查self.\uuuu class\uuuu.@KarlKnechtel是的,我想要一个解决方案,尽管我实际上只使用普通方法。问题不是从方法本身获取类,而是将此方法传递给将获取该类的函数?我想知道,因为期望的结果实际上是论点的一部分。你已经有Hello和Bonjour了。等等,你想要一个单一的解决方案来处理classmethods和普通方法吗?为什么?在AFAICT中,您将使用该技术实现单个方法,因此您已经知道您是在类方法中工作还是在普通方法中工作。在classmethod中,传入的cls已经是您需要的类对象;在普通方法中,您可以检查self.\uuuu class\uuuu.@KarlKnechtel是的,我想要一个解决方案,尽管我实际上只使用普通方法。问题不是从方法本身获取类,而是将此方法传递给将获取类的函数。