繁体   English   中英

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

[英]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 通常,您可以为此使用globalnonlocal关键字,但是在您的情况下,您只想在类上查找它:

self.__class__.object_counter += 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM