好吧,我们假设我们有这段代码:
class Master(object):
id = SomePythonMagic()
class Slave1(master):
pass
class Slave2(master):
pass
class Slave3(master):
pass
slave1 = Slave1()
print slave1.id
>> 1
slave2 = Slave2()
print slave2.id
>> 2
slave3 = Slave3()
print slave3.id
>> 3
slave4 = Slave1()
print slave4.id
>> 1
问题是,我希望每个继承master类的类都有自己的id,如果它可以是一个普通的计数器,那就太棒了,但任何id都可以。我希望ID嵌入到元类中,所以即使我调用Slave1.ID,我仍然会得到数字1,就像类的每个实例一样。
有人对这个问题有什么想法或解决方案吗?
这是元类的一个例子。元类是自定义其他类结构的类。
# Define the metaclass
class metacls(type):
counter = 0
def __new__(meta_class, name, bases, attributes):
attributes['id'] = metacls.counter
metacls.counter += 1
return type.__new__(meta_class, name, bases, attributes)
# Set the metaclass
class Master(object): __metaclass__ = metacls
class Slave1(Master): pass
class Slave2(Master): pass
class Slave3(Master): pass
print Slave1.id, Slave1().id
# 1 1
print Slave2.id, Slave2().id
# 2 2
print Slave3.id, Slave3().id
# 3 3
class ClassIncrementor:
def __init__(self):
self.id = 0
def __call__(self, cls):
self.id += 1
cls.id = self.id
return cls
taskIncrementor = ClassIncrementor()
@taskIncrementor
class Slave1(object):
pass
@taskIncrementor
class Slave2(object):
pass
@taskIncrementor
class Slave3(object):
pass
结果:
(1, <__main__.Slave2 object at 0x021C1DF0>)
(0, <__main__.Slave1 object at 0x021CA130>)
(2, <__main__.Slave3 object at 0x021CA290>)
(2, <__main__.Slave3 object at 0x021CA290>)
(2, <__main__.Slave3 object at 0x021CA290>)
这是我想要的一个解决方案,如果有人对如何解决这个问题有更好的想法,请尽一切努力:)
你说递增是可选的,是吗?
如果您可以使用伪随机方式来识别对象,那么您可能只需要在__init__
调用期间调用id(self)
就可以了。
>>> class A(object):
... def __init__(self):
... self.uid = id(self)
...
>>> Stick = A()
>>> Stick.uid
4385894928
>>> Jupiter = A()
>>> Jupiter.uid
4385894672