@
sudo987 我一开始理解为随便 new 出来一个 object 了,后来才发现是说 object 本身。
这个问题其实有点好玩,__dict__属性的存在按照上面的文档无需赘述,而按照 dir 的文档,如果调用的参数是有__dir__函数的话,是会调用参数的__dir__函数的,在 interactive 中测试下就会发现 object 本身是有__dir__函数的,尝试调用这个函数会发现需要传参,如果我们传入 object 作为参数,看到的结果里面就会有__dict__了,如下:
In [33]: object.__dir__(object)
Out[33]:
['__hash__',
'__instancecheck__',
'__subclasshook__',
'__module__',
'__class__',
'__setattr__',
'__reduce__',
'__ne__',
'__str__',
'__new__',
'__text_signature__',
'__basicsize__',
'__repr__',
'__ge__',
'__weakrefoffset__',
'__call__',
'__abstractmethods__',
'__dictoffset__',
'__le__',
'__getattribute__',
'__lt__',
'__format__',
'__name__',
'__itemsize__',
'__sizeof__',
'mro',
'__bases__',
'__qualname__',
'__reduce_ex__',
'__flags__',
'__dir__',
'__dict__',
'__init__',
'__subclasscheck__',
'__doc__',
'__subclasses__',
'__eq__',
'__mro__',
'__delattr__',
'__prepare__',
'__gt__',
'__base__']
而如果我们传入 None 作为参数,结果就和 dir(object)的结果几乎一样了,但是多了一个__bool__而且是不能调用的,如下:
In [34]: object.__dir__(None)
Out[34]:
['__hash__',
'__class__',
'__subclasshook__',
'__format__',
'__eq__',
'__reduce__',
'__bool__',
'__new__',
'__repr__',
'__gt__',
'__le__',
'__setattr__',
'__lt__',
'__str__',
'__sizeof__',
'__getattribute__',
'__ne__',
'__doc__',
'__init__',
'__ge__',
'__reduce_ex__',
'__delattr__',
'__dir__']
查看 python 的源码也可以发现,默认确实是传入 None 的。(
https://hg.python.org/cpython/file/3.5/Objects/object.c +1326)
更具体的估计要跟 object 的实现代码才可以看出来了。