【问题标题】:What attributes does `__dict__` of a class or an instance contain, and what doesn't?类或实例的 __dict__ 包含哪些属性,哪些不包含?
【发布时间】:2017-09-06 01:36:03
【问题描述】:

对于一个类的属性:

  • 类或实例的属性__dict__不包括__base____name__。 类的__dict__ 包含哪些属性,哪些不包含?
  • 如何获取一个类的所有属性?

对于实例的属性:

  • 实例的属性__dict__ 不包括__class__。 实例的__dict__ 包含哪些属性,哪些不包含?
  • 如何获取实例的所有属性?

谢谢。

【问题讨论】:

  • 查看dir函数。它包括超类的参数。更多信息here
  • 它不包括大多数魔术方法,在__slots__ 中定义的任何东西等等。
  • @MadPhysicist 谢谢。 “魔术方法”是什么意思?
  • @Ben。任何以双下划线开头和结尾的东西:__init____new____eq__ 等。这些方法在 Python 中有特殊用途,你不应该编造新的,而且大部分都没有在 __dict__ 中设置据我所知。
  • 此外,您可以通过__getattr____getattribute__ 拥有无限数量的可访问属性,主要是后者。

标签: python python-3.x


【解决方案1】:

__dict__ 不包括:

  • 在类型(或 mro 中的任何类型)上定义的任何属性(或描述符)。
  • 声明为用 C 实现的类型的一部分的任何属性。
  • __slots__ 中声明的任何属性。

列出所有属性的最佳方法是dir,但它通常不可靠。

【讨论】:

  • 还有覆盖__dict__本身的方法,以及覆盖覆盖的方法。我忘记了这是如何工作的。
【解决方案2】:

dict 很有趣。你需要了解的是 Python 是如何查找属性、方法等的。像 name 这样的东西存储在 dir(instance) 中,这不是标准的 getattr 的一部分你的班。只有显式定义的属性和方法是 A.dict 的一部分,其他东西是复杂查找系统的一部分,其余部分是查看类、子类等,直到你得到到“对象”。

【讨论】:

  • 第二个问题都没有回答;并请检查格式__dict__ vs dict
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多