3

重複の可能性:
クラスインスタンスのIDの自動インクリメント

Pythonで次のJavaクラスのようなものにしたいです。

public class MyObject {
    private static int ID = 0;
    private final int id;
    public MyObject() {
        id = ID++;
    }
}

このJavaコードでは、すべてmyObjectが持つidことになり、2つのオブジェクトが同じIDを持つことができる方法はありません(これは1スレッドのアプリケーションです)。

Pythonでこのようなことをすることはできますか?

4

3 に答える 3

8

Python では、class 属性を直接参照できます。

class MyObject(object):
    ID = 0

    def __init__(self):
       self.id = MyObject.ID = MyObject.ID + 1

デモ:

>>> class MyObject(object):
...     ID = 0
...     def __init__(self):
...        self.id = MyObject.ID = MyObject.ID + 1
... 
>>> MyObject().id
1
>>> MyObject().id
2
>>> MyObject().id
3
>>> MyObject.ID
3
于 2012-11-12T22:10:00.780 に答える
2

@Martjin Pieters の回答に関するコメントで述べたように、ビルトインでid()十分にニーズを満たすことができます。 id(obj)アクセス時に一意であるシステム内の任意のオブジェクトの ID を返します (本質的に、一部のインタープリターでは文字通り、オブジェクトのメモリ アドレス)。オブジェクトが頻繁に破棄されているが、ID 参照が破棄後も有効なままである必要がある場合を除きid()、一意の ID のニーズに対応する必要があります。

ドキュメントから:

[id() によって返される値] は整数 (または長整数) であり、このオブジェクトの存続期間中、一意で一定であることが保証されています。有効期間が重複しない 2 つのオブジェクトは、同じ id() 値を持つ場合があります。

于 2012-11-12T22:23:12.717 に答える
1

@Martjin Pietersは正しい考えを持っていますが、私はこれを採用することをお勧めしitertools.countます:

class MyObject(object):
    ID = itertools.count()

    def __init__(self):
       self.id = MyObject.ID.next()

>>> MyObject().id
0
>>> MyObject().id
1
>>> MyObject().id
2
>>> MyObject.ID
count(3)

お役に立てれば

于 2012-11-12T22:39:15.080 に答える