获取 Python 类的完全限定名称(Python 3.3+)

Posted

技术标签:

【中文标题】获取 Python 类的完全限定名称(Python 3.3+)【英文标题】:Get fully qualified name of a Python class (Python 3.3+) 【发布时间】:2016-09-30 18:57:41 【问题描述】:

如何从模块根目录获取包含完整路径的类名称?对于 Python 3.3 及更高版本?

以下是 Python 代码示例:

class A:
    class B:
        class C:
            def me(self):
                print(self.__module__)
                print(type(self).__name__)
                print(repr(self))

x = A.B.C()
x.me()

这段代码在 Python 3.3 上输出:

__main__
C
<__main__.A.B.C object at 0x0000000002A47278>

所以,Python 内部知道我的对象是__main__.A.B.C,但我怎样才能以编程方式获得它呢?我可以解析 repr(self),但这对我来说听起来像是一个 hack。

【问题讨论】:

***.com/questions/1401661/… 的可能重复请通过__bases__ 属性和inspectmodule 提供的使用信息在此处查找方法解析顺序(mro)除了正式继承链之外也是有趣的信息“展示”。因为这个规则(如果提供多个​​方法)将被选择,就像一个有效的层次结构。 检查__qualname__ 属性。 【参考方案1】:

您正在寻找__qualname__(在 Python 3.3 中引入):

class A:
    class B:
        class C:
            def me(self):
                print(self.__module__)
                print(type(self).__name__)
                print(type(self).__qualname__)
                print(repr(self))

【讨论】:

哦。我已经寻找过这个属性并尝试使用 IPython 找到它,但制表符完成根本没有显示它。不知道为什么。

以上是关于获取 Python 类的完全限定名称(Python 3.3+)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中获取计算机的完全限定域名?

如何将完全限定的类名映射到 Python 中的类对象?

为啥在 JDK 类中使用完全限定名称声明 Serializable?

如何在 C# 中使用反射获取类型的完全限定名称

TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?

范围是静态确定并动态使用的意思是什么?