如何计算自定义类的实例数量?

4 投票
1 回答
4727 浏览
提问于 2025-04-19 01:43

我想在Python3.x中统计一个自定义类及其子类的实例数量。请问该怎么做?非常感谢。

我尝试过使用类成员的方法,但没有成功。以下是我的代码:

Base.py

class Base:

    ## class members
    __counter = int(0)
    @classmethod
    def _count(cls):
        cls.__counter += 1
        return cls.__counter

    def __init__(self):
        self.__id = self._count()

    @property
    def id(self):
        return self.__id

SubBase1.py

from Base import Base

class SubBase1(Base):
    def __init__(self):
        Base.__init__(self)

SubBase2.py

from Base import Base

class SubBase2(Base):
    def __init__(self):
        Base.__init__(self)

main.py

from SubBase1 import SubBase1
from SubBase2 import SubBase2

s1 = SubBase1()
s2 = SubBase2()

print('s1-id', s1.id)
print('s2-id', s2.id)

这些代码的输出是:

s1-id 1
s2-id 1

但是,我想要的是:

s1-id 1
s2-id 2

我该怎么做呢?首先非常感谢!
PS:环境:Ubuntu 14.04 + Python 3.4 + PyDev

1 个回答

3

cls上设置属性会在子类上创建一个新的属性。你需要在Base上明确设置这个属性:

class Base:
    __count = 0

    @classmethod
    def _count(cls):
        Base.__count += 1
        return Base.__count

    def __init__(self):
        self.__id = self._count()

    @property
    def id(self):
        return self.__id

如果你尝试在cls上设置属性,你会为每个类创建独特的计数器,这些计数器不会和所有子类共享。

示例:

>>> class Base:
...     __count = 0
...     @classmethod
...     def _count(cls):
...         Base.__count += 1
...         return Base.__count
...     def __init__(self):
...         self.__id = self._count()
...     @property
...     def id(self):
...         return self.__id
... 
>>> class SubBase1(Base): pass
... 
>>> class SubBase2(Base): pass
... 
>>> SubBase1().id
1
>>> SubBase1().id
2
>>> SubBase2().id
3
>>> SubBase2().id
4

撰写回答