出于日志目的,我希望检索Python对象的完全限定类名。(对于完全限定,我指的是类名,包括包名和模块名。)
我知道x.__class__.__name__
,但是有没有简单的方法来获取包和模块呢?
发布于 2010-01-07 20:03:03
使用以下程序
#!/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
定义为
class Bar(object):
def __init__(self, v=42):
self.val = v
输出为
$ ./prog.py
foo.Bar
如果您仍然使用Python2,则必须使用__name__
而不是__qualname__
,后者对嵌套类的信息较少-嵌套在类Foo
中的类Bar
将显示为Bar
而不是Foo.Bar
def fullname(o):
klass = o.__class__
module = klass.__module__
if module == '__builtin__':
return klass.__name__ # avoid outputs like '__builtin__.str'
return module + '.' + klass.__name__
发布于 2013-05-27 05:23:34
提供的答案不涉及嵌套类。尽管它直到Python3.3 (PEP 3155)才可用,但您确实希望使用类的__qualname__
而不是__name__
。否则,像这样的类
class Foo:
class Bar: # this one
pass
将只显示为Bar
而不是Foo.Bar
。
(您仍然需要将__module__
单独附加到限定名- __qualname__
不打算包括模块名称。)
发布于 2010-01-07 19:58:56
考虑使用具有像getmodule
这样的函数的inspect
模块,这可能就是我们想要的:
>>>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'>
https://stackoverflow.com/questions/2020014
复制相似问题