Skip to main content
 首页 » 编程设计

python之为 Python 中的每个对象设置唯一 ID

2025年05月04日16emanlee

我需要创建类,每个实例化的对象都将具有唯一的 ID(简单地增加计数器)。现在,所有 3 个对象(b、b1、b2)共享一个 A.__COUNTER 变量。

class A(type): 
__COUNTER = 0 
 
def __call__(cls, *args, **kwargs): 
    setattr(cls, "id", A.__COUNTER)  
    A.__COUNTER += 1 
 
    return type.__call__(cls, *args, **kwargs) 
 
 
class B(): 
    __metaclass__ = A 
 
    def __init__(self): 
       self.id 
 
b = B() 
b1 = B() 
b2 = B() 
 
print(b.id, b1.id, b2.id) -> (2, 2, 2) 

看来我走错方向了

附言已解决

对不起,伙计们,我没有提到可以有几个类应该共享相同的 id 序列。 有很多解决方案,这里是我如何解决的

class A(type): 
__COUNTER = 0 
def __call__(cls, *args, **kwargs): 
    obj = type.__call__(cls, *args, **kwargs) 
    obj.setId(A.__COUNTER) 
    A.__COUNTER += 1 
 
    return obj 
 
 class B(): 
    __metaclass__ = A 
 
    def setId(self, id): 
        self.id = id  
 
class C(): 
   __metaclass__ = A 
 
   def setId(self, id): 
       self.id = id  
 
b = B() 
b1 = B() 
b2 = B() 
c = C() 
b3 = B() 
 
print(b.id, b1.id, b2.id, c.id, b3.id) -> (0, 1, 2, 3, 4) 

请您参考如下方法:

您可以只使用类变量:

class B (): 
    __lastId = 1 
 
    def __init__ (self): 
        self.id = B.__lastId 
        B.__lastId += 1 
>>> [B().id for _ in range(10)] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

如 What is a metaclass? 中所述,元类是类的类,而您只想修改单个类型的实际实例化对象。所以这里没有必要深入到元类的复杂程度。