python中的__qualname__是什么?

Rei*_*ica 32 python python-3.x

  • __qualname__python中有什么,它有什么用?

  • 为什么我需要使用它__name__

我阅读了文档,但它们并没有帮助我清楚地了解它的用处。

我已阅读获取 Python 类的完全限定名称 (Python 3.3+)
这个问题问的是“如何获得一个合格的名字”,它假定人们知道“合格的名字”的含义。显然,该问题的答案是使用__qualname__属性。

我的问题是什么 __qualname__为什么我应该在__name__.

Mat*_*lin 52

__qualname__例如,提供比__name__调试更完整的信息,因此对调试更有帮助。

例子:

>>> def f(): pass
... class A:
...    def f(self): pass
...    class A:
...        def f(self): pass
...
>>> # __name__ is not showing the path, so these functions look equal
>>> f.__name__
'f'
>>> A.f.__name__
'f'
>>> A.A.f.__name__
'f'
>>> # And these classes looks equal
>>> A.__name__
'A'
>>> A.A.__name__
'A'
>>>
>>> # __qualname__ shows the path, so these functions are distinguishable
>>> f.__qualname__
'f'
>>> A.f.__qualname__
'A.f'
>>> A.A.f.__qualname__
'A.A.f'
>>> # And these classes are distinguishable
>>> A.__qualname__
'A'
>>> A.A.__qualname__
'A.A'
Run Code Online (Sandbox Code Playgroud)

__qualname__还增加了一些与 Python 2 的.im_class.

PEP 3155 基本原理中的更多详细信息

  • 这不仅有助于调试,而且在猴子修补时也非常有用,以避免在检查原始函数是否是您期望的函数时出现误报。 (4认同)

小智 13

只是为了(可能)添加到前面的答案,__qualname__也可以从类内部调用,而不必绑定到任何方法。当您没有__init__定义方法时,这允许从类内部获取类的名称:

class myClass:
    print(__qualname__)
Run Code Online (Sandbox Code Playgroud)

这将返回:

myClass
Run Code Online (Sandbox Code Playgroud)

我发现这很有用的一个实际场景是使用logging. 如果要在具有类的模块中实现它,如前所述,该类没有__init__方法,即仅包含类方法,然后将类的名称添加到logging需要加入日志的点符号路径由不同的模块生成到一个单一的,__qualname__似乎是一个简单的解决方案。