Class 计算一个类的实例?
我一直在清理我正在扩展的模块中的一些代码,但我似乎找不到一种方法来Pythonify此代码: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这
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库。每个PDFObj
都需要打印出其各自的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())