首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中获取对象的完全限定类名

在Python中获取对象的完全限定类名
EN

Stack Overflow用户
提问于 2010-01-07 19:50:28
回答 12查看 105.3K关注 0票数 166

出于日志目的,我希望检索Python对象的完全限定类名。(对于完全限定,我指的是类名,包括包名和模块名。)

我知道x.__class__.__name__,但是有没有简单的方法来获取包和模块呢?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-01-07 20:03:03

使用以下程序

代码语言:javascript
复制
#!/usr/bin/env python

import foo

def fullname(o):
    klass = o.__class__
    module = klass.__module__
    if module == 'builtins':
        return klass.__qualname__ # avoid outputs like 'builtins.str'
    return module + '.' + klass.__qualname__

bar = foo.Bar()
print(fullname(bar))

并将Bar定义为

代码语言:javascript
复制
class Bar(object):
  def __init__(self, v=42):
    self.val = v

输出为

代码语言:javascript
复制
$ ./prog.py
foo.Bar

如果您仍然使用Python2,则必须使用__name__而不是__qualname__,后者对嵌套类的信息较少-嵌套在类Foo中的类Bar将显示为Bar而不是Foo.Bar

代码语言:javascript
复制
def fullname(o):
    klass = o.__class__
    module = klass.__module__
    if module == '__builtin__':
        return klass.__name__ # avoid outputs like '__builtin__.str'
    return module + '.' + klass.__name__
票数 180
EN

Stack Overflow用户

发布于 2013-05-27 05:23:34

提供的答案不涉及嵌套类。尽管它直到Python3.3 (PEP 3155)才可用,但您确实希望使用类的__qualname__而不是__name__。否则,像这样的类

代码语言:javascript
复制
class Foo:
    class Bar: # this one
        pass

将只显示为Bar而不是Foo.Bar

(您仍然需要将__module__单独附加到限定名- __qualname__不打算包括模块名称。)

票数 48
EN

Stack Overflow用户

发布于 2010-01-07 19:58:56

考虑使用具有像getmodule这样的函数的inspect模块,这可能就是我们想要的:

代码语言:javascript
复制
>>>import inspect
>>>import xml.etree.ElementTree
>>>et = xml.etree.ElementTree.ElementTree()
>>>inspect.getmodule(et)
<module 'xml.etree.ElementTree' from 
        'D:\tools\python2.5.2\lib\xml\etree\ElementTree.pyc'>
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2020014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档