0

我有一个代表要保存在集合中的对象的类。我希望类本身记住它创建了多少,以便在您调用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

或类似的东西。目前,这种方法似乎给出了“分配前引用的变量”错误。

4

3 回答 3

3

你需要写:

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

否则只有当 object_counter 是一个全局变量时它才会起作用。

于 2012-12-17T08:57:00.057 回答
2

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

更好地itertools.count()用于获得一个万无一失的“静态”计数器;然后无需重新分配回类属性:

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。子类可以根据需要提供自己的计数器,也可以复用父类的计数器。

于 2012-12-17T09:11:42.357 回答
1

线

object_counter += 1

翻译成

object_counter = object_counter + 1

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

要修复它,告诉 Python 在哪里查找object_counter. 通常,您可以为此使用globalornonlocal关键字,但在您的情况下,您只想在类中查找它:

self.__class__.object_counter += 1
于 2012-12-17T08:57:59.977 回答