gpt4 book ai didi

Python 检查将方法识别为 FunctionType 而不是 types.MethodType

转载 作者:行者123 更新时间:2023-12-01 05:04:13 26 4
gpt4 key购买 nike

我正在尝试使用 python 检查模块检查源代码。我在本例中检查的代码示例是:

class xxx:

def __init__(self):
pass

def xxxmethod(self):
pass

我希望当我检查这段代码并检查“xxxmethod”的类型时,它会是 types.MethodType。正如建议的那样here ,我用它来接收函数元素:

found_function = getattr(class_element, method_name, None)

但是它的类型是 types.FunctionType 而不是 types.MethodType。

当我使用 getmembers() 打印 class_element 的内容时,

('xxxmethod', <function xxxmethod at 0x00000000028EC6C8>)

这是字典中的元素。

它到底为什么会这样?我是不是忽略了什么?

编辑:class_element 是从范围字典接收的。这与这不是该类的实例有关吗?

谢谢!

最佳答案

Python 2 和 3 在这方面有所不同。

在 Python 2 中你会得到:

<type 'instancemethod'>

但是如果你打印该方法会给出:

<unbound method A.m>

在 Python 3 中,您将得到:

<class 'function'>

最终是因为您正在查找类上的方法。

在 Python 2 中,通过类访问方法会返回所谓的未绑定(bind)方法。 Python 3 中取消了未绑定(bind)方法的概念。

现在,如果您实际上创建了该类的实例,那么在 Python 2 中您将再次得到:

<type 'instancemethod'>

如果你打印出来会给出:

<bound method A.m of <__main__.A instance at 0x10ae7ad40>>

在 Python 3 中:

<class 'method'>

这相当于 Python 2 中的实例方法,并且类似地打印为:

<bound method A.m of <__main__.A object at 0x10063c6d8>>

所以是的,这是因为您没有在类的实例上查找方法。 Python 3 不再具有未绑定(bind)方法的概念这一事实进一步令人困惑。

关于Python 检查将方法识别为 FunctionType 而不是 types.MethodType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25400035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com