我有一个表示要保存在集合中的对象的类。我希望类本身能够记住它创建了多少,这样当你调用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
或类似的东西。目前看来,这种方法给出了“在赋值前引用的变量”错误。
答案 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
。一般情况下,您可以使用global
或nonlocal
关键字,但在您的情况下,您只想在课堂上查找:
self.__class__.object_counter += 1