【问题标题】:What is __qualname__ in python?python中的__qualname__是什么?
【发布时间】:2020-01-26 05:48:17
【问题描述】:
  • python 中的__qualname__ 是什么,它有什么用处?

  • 为什么我需要在__name__ 上使用它?

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

我已阅读Get fully qualified name of a Python class (Python 3.3+)
该问题询问“如何获得限定名”,这假定人们知道“限定名”的含义。显然,该问题的答案是使用__qualname__ 属性。

我的问题是 什么 __qualname__ 是,为什么我应该使用它而不是 __name__

【问题讨论】:

  • @Selcuk 怎么是重复的?我问的是__qualname__ 是什么以及它是如何使用的,而不是我如何获得完全限定的名称...
  • 您链接的问题没有解释它的作用或用途。
  • You are looking for __qualname__ (introduced in Python 3.3):
  • 我不认为这是对 __qualname__ 的解释。
  • 您可能想详细说明为什么这些文档没有帮助您理解什么是限定名称。我觉得解释很直接。帮助我们理解您的不理解有助于我们提供适当的解释,希望能帮助您理解。

标签: python python-3.x


【解决方案1】:

__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'

__qualname__ 还添加了一些与 Python 2 的 .im_class 的向后兼容性。

More details in the rationale for PEP 3155

【讨论】:

  • 这不仅有助于调试,而且在猴子修补时也非常有用,以避免在检查原始函数是否是您期望的函数时出现误报。
【解决方案2】:

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

class myClass:
    print(__qualname__)

这将返回:

myClass

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

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 2020-04-06
    • 1970-01-01
    • 2015-02-25
    • 2012-10-09
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多