2012-11-12 125 views
4

可能重複:
Auto-incrementing IDs for Class Instances一個int對於每個Python對象

我想在Python類似下面的Java類:

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

在此Java代碼,每myObject將有id並且將不會有兩個對象可能h相同的ID(這是一個單線程應用程序)。

我可以在Python中做這樣的事嗎?

+0

你真的不應該在調用一個變量'id' Python,因爲這是返回對象身份的內置函數的名稱。 – abarnert

回答

8

在Python中,你可以直接引用類屬性:

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 
+0

爲什麼'id'每次訪問都會改變?上面的代碼不會那樣做。 – Whymarrh

+1

他只說每個對象都需要一個uid,而不是他們必須是順序的。 'id()'可能對他來說同樣適用(除非可以重新應用一個GC對象的id到一個新對象的小風險是一個問題)。 –

+0

@Whymarrh,這是因爲每個「id」來自不同的對象。每個新對象都被分配一個唯一的ID號碼。 –

2

正如我在上@Martjin皮特斯的回答評論所說,id()內置可足夠滿足您的需求。 id(obj)爲訪問時唯一的系統中的任何對象返回一個id(實際上,在某些解釋器中實際上是對象的內存地址)。除非你的對象經常被銷燬,但你的id引用需要在破壞之後保持有效,id()應該適合你的獨特id需求。

從文檔:

[由ID返回的值()]是被保證是唯一 和常數在其壽命期間該對象的整數(或長整數)。非重疊生命期的兩個對象可能具有相同的id()值。

+1

+1。但是可能值得引用docs(「這是一個整數(或長整數),它在其生命週期中保證是唯一的並且是常量)。具有非重疊生命週期的兩個對象可能具有相同的id()值。 「)或類似的'help(id)'文本。 – abarnert

0

@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) 

希望這有助於

+0

使整個迭代器對象只增加一個整數給予什麼好處?這個用例看起來不夠複雜,不足以證明增加的開銷。 –

+0

如果你不小心碰到了'='而不是'+'會怎麼樣?如果在您意識到如果您想通過'n!= 1'增加之前以多種方式遞增,會發生什麼情況,等等...... – inspectorG4dget

+0

「如果您輸入錯字」會同樣適用於任何解決方案。至於其他情況,OP會特別說明他的要求。過度設計以支持每個假設的用例並不重要。針對您擁有的問題和您可以預測的增長進行設計,而不是假設這是用於存儲核碼的情況。也就是說,除非你認爲你的家庭廚房應該有這樣一個:http://www.foodprocessing-technology.com/contractors/industrial_ovens/sveba/sveba5.html –