Python:如何计算创建的对象数量?

时间:2011-05-30 17:32:52

标签: python object static count

我是Python的新手。我的问题是,在任何给定时间内,为了跟踪对象数量而计算python对象数量的最佳方法是什么?我想过使用一个静态变量。

我已阅读了几个Q&一个关于Python的静态变量,但我无法弄清楚如何使用静态实现对象计数。

我的尝试就像这样(下面),从我的C ++背景中我期待这个工作,但事实并非如此。我不是iMenuNumber一个静态成员,每次创建一个对象时都会增加它?

class baseMENUS:
    """A class used to display a Menu"""

    iMenuNumber = 0

    def __init__ (self, iSize):
        self.iMenuNumber = self.iMenuNumber + 1
        self.iMenuSize = iSize

def main():
   objAutoTester = baseMENUS(MENU_SIZE_1)
   ....
   ....
   ....
   objRunATest = baseMENUS(MENU_SIZE_2)

我还没有编写删除( del )函数(析构函数)。

5 个答案:

答案 0 :(得分:16)

使用self.__class__.iMenuNumberbaseMENUS.iMenuNumber代替self.iMenuNumber来设置类而不是实例的var。

此外,匈牙利表示法不是pythonic(实际上,它在所有语言中都很糟糕) - 您可能想要停止使用它。有关代码样式的建议,请参阅http://www.python.org/dev/peps/pep-0008/

答案 1 :(得分:2)

请注意,上述两个答案都是正确的,但它们非常不同。不仅是你写它们的方式,而且是最终结果。

如果您要从baseMENUS类派生,那么差异就会出现。

在n.m。的解决方案中,对于从baseMENUS派生的任何类的所有实例化,计数器都是相同的。另一方面,在ThiefMaster的情况下;对于从baseMENUS派生的每个不同类,都会有计数器。

在下面的示例中。我从baseMENUS派生了两个类。他们是AMENUS和BMENUS;我创建了3个AMENUS实例和4个BMENUS实例。

当我使用n.m的方法时,计数器一直到7。

当我使用ThiefMaster时,我创建了2个计数器。一个到3,另一个到4:

class baseMENUS:
    """A class used to display a Menu"""
    iMenuNumber = 0
    jMenuNumber = 0
    def __init__ (self):
        baseMENUS.iMenuNumber = baseMENUS.iMenuNumber + 1
        self.__class__.jMenuNumber = self.__class__.jMenuNumber + 1
        self.counterNAMEOFCLASS = baseMENUS.iMenuNumber
        self.counterclass = self.__class__.jMenuNumber

class AMENUS(baseMENUS):
    def __init__(self, ):
        super(AMENUS, self).__init__()

class BMENUS(baseMENUS):
    def __init__(self, ):
        super(BMENUS, self).__init__()

allmenus = [AMENUS() for i in range(0,3)] + [BMENUS() for i in range(0,4)]
[print('Counting using n.m. method:', i.counterNAMEOFCLASS, '. And counting using ThiefMaster method :', i.counterclass) for i in allmenus]

创建的输出是:

Counting using n.m. method: 1 . And counting using ThiefMaster method : 1
Counting using n.m. method: 2 . And counting using ThiefMaster method : 2
Counting using n.m. method: 3 . And counting using ThiefMaster method : 3
Counting using n.m. method: 4 . And counting using ThiefMaster method : 1
Counting using n.m. method: 5 . And counting using ThiefMaster method : 2
Counting using n.m. method: 6 . And counting using ThiefMaster method : 3
Counting using n.m. method: 7 . And counting using ThiefMaster method : 4

我很抱歉在讨论的最后5年里跳了起来。但我觉得这样就增加了它。

答案 2 :(得分:1)

我认为您应该使用baseMENUS.iMenuNumber代替self.iMenuNumber

答案 3 :(得分:0)

我将实现以下

class baseMENUS:     “”“用于显示菜单的类”“”

iMenuNumber = 0

def __init__ (self, iSize):
    baseMENUS.iMenusNumber += 1
    self.iMenuSize = iSize

def main():    objAutoTester = baseMENUS(MENU_SIZE_1)    ....    ....    ....    objRunATest = baseMENUS(MENU_SIZE_2)

答案 4 :(得分:0)

class obj:
count = 0
def __init__(self,id,name):
    self.id = id
    self.name = name
    obj.count +=1
    print(self.id)
    print(self.name)

o1 = obj(1,'vin')
o2 = obj(2,'bini')
o3 = obj(3,'lin')
print('object called' ,obj.count)