21

dir()在python中,python中的函数和__dir__属性有什么区别?

>>> 2 .__dir__()
['__divmod__', 'real', '__rxor__', '__floor__', '__hash__', '__index__', '__lt__', '__ceil__', '__repr__', '__reduce_ex__', '__rpow__', '__rand__', '__truediv__', '__subclasshook__', '__doc__', '__radd__', '__or__', '__pow__', '__trunc__', '__rrshift__', '__delattr__', '__reduce__', '__rlshift__', 'conjugate', '__xor__', '__rtruediv__', '__rfloordiv__', '__ge__', '__setattr__', '__class__', 'bit_length', '__neg__', '__mod__', '__int__', '__pos__', 'from_bytes', '__format__', '__rmul__', '__lshift__', '__rsub__', '__new__', '__add__', '__floordiv__', 'imag', 'to_bytes', 'numerator', '__dir__', '__abs__', '__init__', '__sizeof__', '__getnewargs__', '__getattribute__', '__invert__', '__gt__', '__rshift__', '__ne__', '__rdivmod__', '__mul__', '__and__', '__sub__', '__rmod__', '__round__', '__ror__', '__le__', '__eq__', '__float__', '__bool__', '__str__', 'denominator']
>>> dir(2)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
4

4 回答 4

13

文档解释它:

如果对象有一个名为 __dir__() 的方法,该方法将被调用并且必须返回属性列表。这允许实现自定义 __getattr__() 或 __getattribute__() 函数的对象自定义 dir() 报告其属性的方式。

如果对象不提供 __dir__(),该函数会尽力从对象的 __dict__ 属性(如果已定义)及其类型对象中收集信息。结果列表不一定完整,并且当对象具有自定义 __getattr__() 时可能不准确。

于 2013-10-31T10:02:42.300 回答
11

dir内部调用__dir__

In [1]: class Hello():
   ...:     def __dir__(self):
   ...:         return [1,2,3]
   ...:     

In [2]: dir(Hello())
Out[2]: [1, 2, 3]
于 2013-10-31T10:02:21.767 回答
3

dir 调用__dir__方法(如果存在),来自python 文档

dir([object])¶ 不带参数,返回当前本地范围内的名称列表。使用参数,尝试返回该对象的有效属性列表。

如果对象有一个名为 的方法__dir__(),该方法将被调用并且必须返回属性列表。这允许实现自定义__getattr__()__getattribute__()功能的对象自定义dir()报告其属性的方式。

如果对象不提供__dir__(),则该函数会尽力从对象的__dict__属性(如果已定义)及其类型对象中收集信息。结果列表不一定完整,并且当对象具有 custom 时可能不准确__getattr__()

于 2013-10-31T10:03:04.643 回答
1

值得指出的是__dir__,许多对象上的 无法自定义,因此如果您直接调用它,则没有机会在其中放置 shim/wrapper。

如果需要,可以轻松替换内置dir并赋予它一些特殊功能。这样的技巧在调试时非常有用。

于 2013-10-31T10:31:33.663 回答