我需要创建类,每个实例化的对象都将具有唯一的 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? 中所述,元类是类的类,而您只想修改单个类型的实际实例化对象。所以这里没有必要深入到元类的复杂程度。
