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

能否仅传入Property对象获取其完全限定名称?

需求可行性分析与实现思路

你的需求完全可行,Python的内省机制足以支持提取各类对象的完全限定名,进而对接你的帮助页面后端,并非理想化的目标。

核心实现思路

针对不同类型的对象,可通过Python内置的inspect模块及对象的特殊属性来提取完全限定名:

  • 模块:直接使用obj.__name__即可得到完整模块名(如ooolib.foo)。
  • 类:拼接obj.__module__(所属模块)与obj.__name__(类名),得到{模块名}.{类名}(如ooolib.foo.Foo)。
  • 方法(包括__init__):利用obj.__qualname__(包含类与方法的层级名称)结合obj.__module__,拼接为{模块名}.{层级名称}(如ooolib.foo.Foo.__init__)。
  • Property与类属性:
    1. 通过obj.__objclass__获取属性所属的类;
    2. 遍历类的成员,匹配到当前对象对应的名称;
    3. 拼接模块名、类名与属性名,得到完整限定名。

简化实现示例

import inspect

def get_qualified_name(obj):
    # 处理模块对象
    if inspect.ismodule(obj):
        return obj.__name__
    
    # 处理类对象
    if inspect.isclass(obj):
        return f"{obj.__module__}.{obj.__name__}"
    
    # 处理函数/方法对象
    if inspect.isfunction(obj) or inspect.ismethod(obj):
        return f"{obj.__module__}.{obj.__qualname__}"
    
    # 处理property及类属性
    cls = getattr(obj, '__objclass__', None)
    if cls:
        for name, member in inspect.getmembers(cls):
            if member is obj:
                return f"{cls.__module__}.{cls.__name__}.{name}"
    
    # 兜底提示
    raise ValueError(f"无法获取对象 {obj} 的完全限定名")

def hlp(obj):
    try:
        qname = get_qualified_name(obj)
        # 生成对应帮助链接(可根据后端规则调整)
        help_path = qname.replace('.', '/')
        help_url = f"https://ooolib.help.example.com/src/{help_path}"
        # 为属性/方法添加锚点
        if len(qname.split('.')) > 2:
            help_url += f"#{qname.split('.')[-1]}"
        print(f"Launching help for \"{qname}\" at \"{help_url}\"")
    except ValueError as e:
        print(e)

注意事项

  • 对于运行时动态添加的对象(如实例属性、动态生成的方法),可能无法提取到有效的完全限定名,这类场景可根据需求添加过滤逻辑或提示。
  • inspect模块覆盖了绝大多数内省场景,若遇到特殊对象类型,可进一步扩展该模块的API调用逻辑。

内容的提问来源于stack exchange,提问作者Amour Spirit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:23:16