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 に答える
3

dir は、__dir__メソッドが存在する場合はそれを呼び出します。Python のドキュメントから:

dir([object])¶ 引数がなければ、現在のローカルスコープの名前のリストを返します。引数を指定して、そのオブジェクトの有効な属性のリストを返そうとします。

オブジェクトに という名前のメソッドがある場合__dir__()、このメソッドが呼び出され、属性のリストを返す必要があります。__getattr__()これにより、カスタムまたは__getattribute__()関数を実装するオブジェクトはdir()、その属性を報告する方法をカスタマイズできます。

オブジェクトが を提供しない場合、関数はオブジェクトの属性 (定義されている場合) とその型オブジェクトから__dir__()情報を収集するために最善を尽くします。__dict__結果のリストは必ずしも完全ではなく、オブジェクトに custom がある場合は不正確になる可能性があります__getattr__()

于 2013-10-31T10:03:04.643 に答える