You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.10中如何判断对象是否为method_descriptor类型

Python 3.10中如何判断对象是否为method_descriptor类型

嘿,这个问题我之前也折腾过,确实有点头疼——毕竟method_descriptor这种内置类型并没有直接暴露成我们能直接引用的类变量,不管是builtins还是types模块里都找不到它的身影。不过咱们有几种靠谱的办法来实现这个判断需求,我给你一一捋清楚:

方法一:借助已知的method_descriptor实例获取类

既然所有method_descriptor实例都属于同一个类,那我们可以先拿一个确定的实例(比如字符串的__add__方法),通过它的__class__属性拿到这个隐藏的类,之后就可以用isinstance来判断了:

# 先获取method_descriptor对应的类
method_descriptor_cls = str.__add__.__class__

# 现在就能正常用isinstance判断了
test_obj = list.__len__
is_method_desc = isinstance(test_obj, method_descriptor_cls)
print(is_method_desc)  # 输出True

像int.__sub__、dict.__getitem__这些都是现成的method_descriptor实例,随便挑一个来拿类就行。

方法二:用inspect模块的现成函数(最推荐)

Python的inspect模块其实已经封装好了专门判断方法描述符的函数,直接用就行,内部已经帮我们处理了这些内置类型的隐藏细节:

import inspect

# 测试示例
print(inspect.ismethoddescriptor(str.__add__))  # True
print(inspect.ismethoddescriptor(lambda x: x))  # False

这个方法最省心,也最可靠,适合绝大多数场景,包括你提到的Sphinx相关的需求。

方法三:基于类型名称和特征属性判断

如果不想额外导入模块,也可以通过检查对象的类型名称和专属属性来间接判断。method_descriptor的类型名称就是'method_descriptor',而且通常会带有__objclass__(关联的类)和__name__(方法名)属性:

def is_method_descriptor(obj):
    return (
        type(obj).__name__ == 'method_descriptor'
        and hasattr(obj, '__objclass__')
        and hasattr(obj, '__name__')
    )

# 测试
print(is_method_descriptor(str.__add__))  # True
print(is_method_descriptor(123))  # False

这种方法虽然不如前两种严谨,但胜在轻量,要是你的场景里不需要太严格的类型判断,这个也完全够用。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:08:06