我是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 )函数(析构函数)。
答案 0 :(得分:16)
使用self.__class__.iMenuNumber
或baseMENUS.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)