如果命令`dir('' .__ dir __.__ dir __.__ dir __.__ dir __)`停止打印其属性?

时间:2017-08-08 14:56:55

标签: python python-internals

每个对象都有一个__dir__属性,如果追加额外的.__dir__引用,命令会停止吗?

>>> dir(''.__dir__)
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

>>> dir(''.__dir__.__dir__.__dir__.__dir__)
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

在足够的情况下会停止'。 dir '附加?

1 个答案:

答案 0 :(得分:7)

您正在使用dir()属性的__dir__,该属性是builtin_function_or_method对象,具有__dir__属性。所以是的,你可以无休止地链接那些__dir__属性查找,因为结果总是相同的;绑定方法对象:

>>> ''.__dir__.__dir__
<built-in method __dir__ of builtin_function_or_method object at 0x10672cfc0>
>>> ''.__dir__.__dir__.__dir__
<built-in method __dir__ of builtin_function_or_method object at 0x1067361f8>

Python中的每个对象都有__dir__ attribute,它始终是可调用的。

注意:连接属性查找的方式会使绑定的方法对象链保持活动状态,因此最终会耗尽内存;每个__dir__方法包装器引用其__self__属性中的前一个。