为每个继承类分配标识符



好吧,我们假设我们有这段代码:

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

最新更新