python - python 如何使用 dir(object) 显示所有属性和方法的列表?

标签 python

我在阅读 python dunder 方法时发现我们可以对像 len(object) 这样的内置方法有自己的定义
所以我创建了一个类 otherclass ,它有定义

>>> class otherclass:
        def __len__(self):
            return 0

>>> len(otherclass())
0

>>> dir(otherclass)
['__doc__', '__len__', '__module__']

它确实打印了对象的 len 并进一步检查我还发现 len dunder 方法在使用 dir 的其他类对象中可用

我想知道 python 如何显示 dir(object) 的值,因为 dir(otherclass) 的结果中没有 dir dunder 方法

最佳答案

我的意思是我 (python 3.6) dir(otherclass) 打印

['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

最有趣的是 __dict__

otherclass.__dict__ == \
mappingproxy({'__dict__': <attribute '__dict__' of 'otherclass' objects>,
              '__doc__': None,
              '__len__': <function __main__.otherclass.__len__>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'otherclass' objects>})

所以这包含所有特定于该对象的方法/属性。然而,所有其他人从何而来?好吧,来自父类(super class):

object.__dict__

object.__dict__ == \ 
mappingproxy({'__class__': <attribute '__class__' of 'object' objects>,
              '__delattr__': <slot wrapper '__delattr__' of 'object' objects>,
              '__dir__': <method '__dir__' of 'object' objects>,
              '__doc__': 'The most base type',
              '__eq__': <slot wrapper '__eq__' of 'object' objects>,
              '__format__': <method '__format__' of 'object' objects>,
              '__ge__': <slot wrapper '__ge__' of 'object' objects>,
              '__getattribute__': <slot wrapper '__getattribute__' of 'object' objects>,
              '__gt__': <slot wrapper '__gt__' of 'object' objects>,
              '__hash__': <slot wrapper '__hash__' of 'object' objects>,
              '__init__': <slot wrapper '__init__' of 'object' objects>,
              '__init_subclass__': <method '__init_subclass__' of 'object' objects>,
              '__le__': <slot wrapper '__le__' of 'object' objects>,
              '__lt__': <slot wrapper '__lt__' of 'object' objects>,
              '__ne__': <slot wrapper '__ne__' of 'object' objects>,
              '__new__': <function object.__new__>,
              '__reduce__': <method '__reduce__' of 'object' objects>,
              '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>,
              '__repr__': <slot wrapper '__repr__' of 'object' objects>,
              '__setattr__': <slot wrapper '__setattr__' of 'object' objects>,
              '__sizeof__': <method '__sizeof__' of 'object' objects>,
              '__str__': <slot wrapper '__str__' of 'object' objects>,
              '__subclasshook__': <method '__subclasshook__' of 'object' objects>})

所以dir寻找__dir__方法,然后寻找__dict__(或__slots__),然后递归依次在每个类中查找方法解析顺序(可用 otherclass.mro())。

关于python - python 如何使用 dir(object) 显示所有属性和方法的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001152/

相关文章:

python - 使用 with..open 时跳过一行

python - Tkinter 检查哪个条目最后有焦点

python - 在 SQLAlchemy 中以多对多关系关联对象

python - 从 SVG 输入生成 PDF

java - 如何在运行时从 python 提供 Java 输入?

python - Reportlab 第 x 页,共 y 页 NumberedCanvas 和图像

python - 修改一列的值在原始值后添加一个词

python - 递归函数不返回值

python - 在生产环境中发布基于 python/ruby/script 的 Web 应用程序时的实践

python - 手机图片的旋转图像方向