[英]Class assigning index to object using static class variable
我有一个类,代表要保留在集合中的对象。 我希望类本身记住它创建了多少个,以便在调用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
或类似的东西。 当前,这种方法似乎给出了“赋值之前引用的变量”错误。
您需要写:
def get_index(self):
SetObject.object_counter += 1
return SetObject.object_counter-1
否则,只有在object_counter是全局变量的情况下才起作用。
您需要使用对类的引用来引用它的变量。 您也许可以使用类方法(使用@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
。 子类可以根据需要提供自己的计数器,或者重新使用父类计数器。
线
object_counter += 1
转换为
object_counter = object_counter + 1
当您在范围内(例如在函数内)分配变量时,Python会假定您要创建一个新的局部变量。 因此,它将object_counter
标记为本地,这意味着当您尝试获取其值(添加一个值)时,会出现“未定义”错误。
要修复它,请告诉Python在哪里查找object_counter
。 通常,您可以为此使用global
或nonlocal
关键字,但是在您的情况下,您只想在类上查找它:
self.__class__.object_counter += 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.