使用静态类变量为对象分配索引的类

时间:2012-12-17 08:54:30

标签: python instantiation

我有一个表示要保存在集合中的对象的类。我希望类本身能够记住它创建了多少,这样当你调用SetObject()__init__()时,会创建一个新对象,它接收一个唯一索引。也许是这样的

class SetObject(object):
  # static class variable 
  object_counter = 0

  def __init__(self, params):
    self.params=params
    self.index = self.get_index()

  def get_index(self):
    object_counter += 1
    return object_counter-1

a = SetObject(paramsa)
b = SetObject(paramsb)
print a.index
print b.index

会产生

0
1

或类似的东西。目前看来,这种方法给出了“在赋值前引用的变量”错误。

3 个答案:

答案 0 :(得分:3)

你需要写:

  def get_index(self):
     SetObject.object_counter += 1
     return SetObject.object_counter-1

否则它只有在object_counter是全局变量时才有效。

答案 1 :(得分:2)

您需要使用对类的引用来引用它的变量;你也许可以使用类方法(使用@classmethod装饰器),但实际上没有必要。

更好地使用itertools.count()来获得一个傻瓜式的“静态”计数器;然后无需重新分配给class属性:

import itertools

class SetObject(object):
   object_counter = itertools.count().next

   def __init__(self, params):
       self.params=params
       self.index = self.object_counter()

(上面的代码假定Python 2;在Python 3上,迭代物没有.next方法,你需要使用functools.partial(next, itertools.count())代替。)

因为计数器是迭代器,所以我们根本不需要分配给SetObject.object_counter。子类可以根据需要提供自己的计数器,或者重新使用父类计数器。

答案 2 :(得分:1)

该行

object_counter += 1

转换为

object_counter = object_counter + 1

当您为范围内的变量(例如函数内部)分配时,Python假定您想要创建一个新的局部变量。因此它将object_counter标记为本地,这意味着当您尝试获取其值(添加一个)时,您会收到“未定义”错误。

要解决此问题,请告诉Python在哪里查找object_counter。一般情况下,您可以使用globalnonlocal关键字,但在您的情况下,您只想在课堂上查找:

self.__class__.object_counter += 1