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

时间:2018-08-24 09:14:09

标签: python

我正在阅读python dunder方法,发现我们可以为len(object)之类的内置方法定义自己的定义
所以我创建了一个具有定义的类class

>>> 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方法

3 个答案:

答案 0 :(得分:1)

我的意思是(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>})

因此,它包含特定于该对象的所有方法/属性。但是,其他所有资源都来自哪里?好吧,来自超类:

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__),然后递归地查找该方法的解析顺序(以{{1 }})依次上课。

答案 1 :(得分:0)

答案在Python文档中:https://docs.python.org/3/library/functions.html#dir

  

如果该对象不提供__dir__(),则该函数将尽最大努力从该对象的__dict__属性(如果已定义)及其类型对象中收集信息。

答案 2 :(得分:0)

dir是内置函数。传递对象时,它将使用对象的__dict__(如果已定义)及其对应的类型对​​象来尝试显示属性。

请注意,如果dir已在对象中被覆盖,则内置__getattr__可能会导致奇怪的输出。

了解更多: https://docs.python.org/3/library/functions.html#dir

发表评论: 抱歉,我没有足够的声誉来发表评论。

Python中的所有对象都隐式具有一堆特殊属性,其中之一就是__dict__属性。在Python中,类也是对象。因此,您的otherclass类已经有一个__dict__。在您的代码中,尝试:

otherclass.__dict__

在输出中,您将看到一些输出与dir调用的输出相对应。

编辑2:

就像我说的那样,类是Python中的对象。它们隐式拥有对象拥有的所有方法。试试:

object.__dict__

,您会在其中找到dir