6

Python の場合:

  • len(a)で置き換えることができますa.__len__()
  • str(a)orはorrepr(a)で置き換えることができますa.__str__()a.__repr__()
  • ==__eq__+__add__、など

を取得する同様の方法はありid(a)ますか? そうでない場合、使用せずに python オブジェクトの一意の ID を取得する回避策はありますid()か?


編集:追加の質問: そうでない場合は? を定義しない理由はあります__id__()か?

4

2 に答える 2

10

いいえ、この動作は変更できません。 「このオブジェクトの存続期間中に一意で一定であることが保証されている整数(または長整数)」id()を取得するために使用されます(source)。この整数には、それ以外の特別な意味はありません (CPython では、オブジェクトが格納されているメモリ位置のアドレスですが、移植可能な Python ではこれに依存できません)。

の戻り値には特別な意味がないため、id()代わりに別の値を返すことを許可しても意味がありません。

さらに、独自のオブジェクトid()に対して一意の整数を返すことは保証できますが、オブジェクトが他のすべての生きているオブジェクトの知識を持つことはできないため、グローバルな一意性制約を満たすことはできません。特別な値の 1 つが、実行時に別のオブジェクトの ID と衝突する可能性があります (可能性は高いです)。これは受け入れられるシナリオではありません。

特別な意味を持つ戻り値が必要な場合は、必要に応じてメソッドを定義し、そこから有用な値を返す必要があります。

于 2013-04-22T17:54:06.220 に答える
0

オブジェクトは、関連付けられている一意の ID は言うまでもなく、それ自体の名前 (複数の名前を持つことができます) を認識していません。つまり - 要するに - いいえ。その理由__len__と共同。作業は、オブジェクトが既にオブジェクトにバインドされていることです。オブジェクトはその ID にバインドされていません。

于 2013-04-22T17:53:39.403 に答える