【问题标题】:How to count the number of instance of a custom class?如何计算自定义类的实例数?
【发布时间】:2014-10-24 18:51:58
【问题描述】:

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

我尝试过class-member的方式,但它不起作用。以下是代码

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

【问题讨论】:

    标签: python python-3.x instance


    【解决方案1】:

    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
    

    【讨论】:

    • 在我的 PyDev 中,它不能很好地工作。但是非常感谢。而且,在这里我必须将类方法 _count(cls) 更改为 _counter(cls) 才能使其工作
    • @user365489:查看我的更新演示和进一步的解释。我这里也用过 Python 3.4,只是还没喝早茶。
    • 我已经在 IDLE3 中尝试了您的第二个代码。它的工作原理如下: >>> SubBase1().id 1 >>> SubBase1().id 2 >>> SubBase2().id 1 >>> SubBase2().id 2 >>>
    • @HAOXuguang:请重新运行我发布的代码;您在cls 上设置属性,而不是Base
    • @Martijn Pieters:现在运行良好。非常非常感谢你。顺便问一下,cls 和 Base 有什么区别?我已经设置了@classmethod
    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多