 |
|
10
lonelinsky Jul 5, 2016
@ 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 的实现代码才可以看出来了。
|