将ID分配给类的实例(Pythonic)

时间:2010-06-07 13:23:44

标签: python

我希望某个类的每个实例都有一个基于我创建它们的顺序的唯一整数标识符,从(比如)0开始。在Java中,我可以使用静态类变量来执行此操作。我知道我可以用Python模仿同样的行为,但是最“Pythonic”的做法是什么?

由于

3 个答案:

答案 0 :(得分:3)

以下方法相对 pythonic (对于我对pythonic的主观判断 - 显式但简洁):

class CounterExample(object):

    instances_created = 0

    def __init__(self):
        CounterExample.instances_created += 1

    def __del__(self):
        """ If you want to track the current number of instances
            you can add a hook in __del__. Otherwise use
            __init__ and just count up.
        """
        CounterExample.instances_created -= 1

如果您面对大量需要这种属性的类,您还可以考虑为此编写元类。

元类的示例:http://www.youtube.com/watch?v=E_kZDvwofHY#t=0h56m10s

答案 1 :(得分:1)

-myyn的回答很好 - 我认为类对象是一个非常好的地方来存放计数器。但是,请注意,写入它不是线程安全的。 所以将它包装在一个使用锁的类方法中:

import threading

class CounterExample(object):

    _next_id = 0
    _id_lock = threading.RLock()

    @classmethod
    def _new_id(cls):
        with cls._id_lock:
            new_id = cls._next_id
            cls._next_id += 1
        return new_id

    def __init__(self):
        self.id = self._new_id()

def test():
    def make_some(n=1000):
        for i in range(n):
            c = CounterExample()
            print "Thread %s; %s has id %i" % (threading.current_thread(), c, c.id)

    for i in range(10):
        newthread = threading.Thread(target=make_some)
        newthread.start()

test()

这将运行10个线程,每个线程创建1000个实例。 如果你在没有锁定代码的情况下运行它,你最终可能会得到最后一个低于9999的id,这表明竞争条件。

答案 2 :(得分:0)

我想一个好问题是它们何时以及如何创建?如果你只是在一个时间点创建一定数量的它们,那么在for循环中使用一个范围。

class A:
    def __init__ (self, id):
        self.id = id
        //do other stuff

class_list = []
for i in xrange(10):
    class_list.append(A(i))

这将是一种pythonic方式。如果你在需要的时候制作它们,那么我认为唯一的方法是在某处保留一个id静态变量。虽然我不确定你是怎么做的。

编辑:哦,当有疑问时“导入此”可以帮助您找到正确的“pythonic”;)