Class 计算一个类的实例?

Class 计算一个类的实例?,class,python,Class,Python,我一直在清理我正在扩展的模块中的一些代码,但我似乎找不到一种方法来Pythonify此代码: global_next_id = 1 class Obj: def __init__(self): global global_next_id self.id = global_next_id global_next_id += 1 这段代码使用一个全局id来跟踪一个类的实例(我在内部也需要变量self.id,它需要是一个数字) 有人能建议一种方法来Pythonify这

我一直在清理我正在扩展的模块中的一些代码,但我似乎找不到一种方法来Pythonify此代码:

global_next_id = 1

class Obj:
  def __init__(self):
    global global_next_id
    self.id = global_next_id

    global_next_id += 1
这段代码使用一个全局id来跟踪一个类的实例(我在内部也需要变量
self.id
,它需要是一个数字)


有人能建议一种方法来Pythonify这个代码吗?

试试这样的方法:

from itertools import count

class Obj(object):
  _ids = count(0)

  def __init__(self):
    self.id = next(self._ids)
发电机

def get_next_id():
    curr_id = 1
    while True:
        yield curr_id
        curr_id += 1

下面是一种在子类不共享相同id/计数的情况下计数实例的方法。元类用于为每个类创建单独的id计数器

对元类使用Python3语法

import itertools

class InstanceCounterMeta(type):
    """ Metaclass to make instance counter not share count with descendants
    """
    def __init__(cls, name, bases, attrs):
        super().__init__(name, bases, attrs)
        cls._ids = itertools.count(1)

class InstanceCounter(object, metaclass=InstanceCounterMeta):
    """ Mixin to add automatic ID generation
    """
    def __init__(self):
        self.id = next(self.__class__._ids)

这应该可以做到:

class Obj:
    _counter = 0
    def __init__(self):
        Obj._counter += 1
        self.id = Obj._counter

我找到了以下解决方案:

class Obj:
    counter = 0

    def __init__(self):
        type(self).counter += 1

    def __del__(self):
        type(self).counter -= 1

最好使用
type(self).counter
而不是
Obj.counter

我完全忽略了类范围的变量。。。感谢您提供的
itertools
解决方案!我希望我能申请独家信用证——我在另一篇文章的某个地方看到过。它优雅而高效。当一个实例被删除时,计数会下降吗?@NegativeZero-不,这里面没有任何东西可以在实例被删除后跟踪它们。它只是在创建每个新实例时以数字形式增加计数器。您必须为实例实现某种注册机制,然后以某种方式处理重用的ID以避免冲突。当目标只是在创建实例时对其进行编号时,这听起来有点过头了。@g.d.d.c-我明白了。我认为目标是计算当前与类关联的实例数。是的,如果目标是统计曾经创建过的实例,那么给出的解决方案是好的。为什么需要使用全局id“跟踪类的实例”呢?这是我正在修改的PDF库。每个PDF
Obj
都需要打印出其各自的ID。为什么使用
type(self.counter
而不是
Obj.counter
?@W Stokvis下面写的是关于u del_uuu(),“The u del_uu()方法在Python中被称为析构函数方法。当对象的所有引用都被删除时,即当对象被垃圾收集时,调用该方法。”因此,通过变量“self”或类型(self)引用是有风险的。Obj.counter是更安全的选项。大多数python答案。我想知道它将如何处理
\u counter
的初始化为零。看起来它只为创建的这个类的第一个实例将其初始化为零,而不是为创建的下一个实例。这就像C++中的<代码>静态< /代码>变量,包括C++中的代码>静态< /代码>类变量。
class InstanceCounter(object):
  # the instance counter
  counter = 0

  def __init__(self, val):
    self.val = all
    # incrementing every time an instance is created
    InstanceCounter.counter += 1

  def set_val(self, val):
    self.val = val

  def get_val(self, val):
    return self.val

  # accessing the instance counter should be done through a class method

  @classmethod
  def get_counter(cls):  
    return cls.counter

# See the instance counter as it increments as new instances are created
a=InstanceCounter(5)
print(a.get_counter())
b=InstanceCounter(7)
print(a.get_counter(), b.get_counter())
c=InstanceCounter(9)
print(a.get_counter(), b.get_counter(), c.get_counter())