【问题标题】:Do all objects have a __qualname__ attribute?所有对象都具有 __qualname__ 属性吗?
【发布时间】:2019-07-18 13:16:33
【问题描述】:

当我遇到pandas.core.indexing._iLocIndexer 的错误时,我正在对 pandas 对象进行一些自省。

docs 说:

definition.__qualname__

类、函数、方法、描述符的限定名称,或 生成器实例。

我想知道是否所有对象都应该有__qualname__(假设 Python 3.3+),如果没有,那些是什么对象。

【问题讨论】:

  • 不,文档明确告诉哪些类型的对象具有该属性:“类、函数、方法、描述符或生成器实例的限定名称。”

标签: python pandas introspection


【解决方案1】:

根据PEP3155 __qualname__ 在class 和function 对象上引入。

现在,我们需要记住,在 Python 中,一切都是一个对象。函数是对象。类是对象!这里我们并不是说“类的实例”是对象,而是类本身就是对象。

例子:

>>> class C:
...     def __init__(self, a): self.a = a
...
>>> c = C(2)
>>> type(c)
<class '__main__.C'>
>>> hasattr(c, '__qualname__')
False
>>> hasattr(C, '__qualname__')
True
>>> C.__qualname__
'C'

所以C 类有__qualname__,但是这个类的实例没有它。但是,您可以通过间接方式检索它:c.__class__.__qualname__ (small c)

函数也一样:

>>> def f(b): print(b)
...
>>> hasattr(f, '__qualname__')
True
>>> f.__qualname__
'f'

如果嵌套类和函数,它们的__qualname__ 将指示此定义层次结构。见What is qualname

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多