我认为您想要一个对象y来计算循环的轮数,而不是每轮创建的实例数(= self.X),也不是自程序启动以来创建的实例的累积数(= test)
我有以下程序来获取仅在循环的每一圈递增一的对象y 。它需要在回合开始时创建一个全新的类。该指令
fb = type('fb',(object,),{'__init__':initer,
'link':linker,
'CLASSIES':0})
是否创建了一个全新的类。所创建的类的显示证明了这一点:print 'id(fb) == %d' % id(fb)
对象的身份是它在内存中的位置。如果不是同一个id,就不是同一个对象:
import sched,time
test = 0
s = sched.scheduler(time.time, time.sleep)
Y = 2000
def initer(self):
global test,Y
if self.__class__.CLASSIES == 0:
Y += 1
self.__class__.CLASSIES += 1
def linker(self):
global test,Y
test = test + 1
self.X = self.X + 1
print 'Y == %d' % Y
print 'test == %d self.X == %d' % (test,self.X)
def loop1(sc):
fb = type('fb',(object,),{'__init__':initer,
'link':linker,
'CLASSIES':0})
print '--------'
print 'id(fb) == %d' % id(fb)
m1 = fb()
m1.X = 0
m1.link()
print
m2 =fb()
m2.X = 1
m2.link()
print
m3 =fb()
m3.X = 2
m3.link()
print '--------'
# Update loop every 10 second
sc.enter(10, 10, loop1, (sc,))
# end loop
s.enter(1, 1, loop1, (s,))
s.run()
显示
--------
id(fb) == 18976648
Y == 2001
test == 1 self.X == 1
Y == 2001
test == 2 self.X == 2
Y == 2001
test == 3 self.X == 3
--------
--------
id(fb) == 13818640
Y == 2002
test == 4 self.X == 1
Y == 2002
test == 5 self.X == 2
Y == 2002
test == 6 self.X == 3
--------
--------
id(fb) == 18970384
Y == 2003
test == 7 self.X == 1
Y == 2003
test == 8 self.X == 2
Y == 2003
test == 9 self.X == 3
--------
--------
id(fb) == 18970864
Y == 2004
test == 10 self.X == 1
Y == 2004
test == 11 self.X == 2
Y == 2004
test == 12 self.X == 3
--------
--------
id(fb) == 18971736
Y == 2005
test == 13 self.X == 1
Y == 2005
test == 14 self.X == 2
Y == 2005
test == 15 self.X == 3
--------
--------
id(fb) == 18957224
Y == 2006
test == 16 self.X == 1
Y == 2006
test == 17 self.X == 2
Y == 2006
test == 18 self.X == 3
--------
.
.
.
etc
我只能通过上述方式获得这个结果。
在每回合结束时删除fb
是不够的,因为您将看到是否运行以下代码。它是您的代码,带有更多指令,具有Y
和显示id(fb)
. 你会看到`` an
id(fb)`` 从一个回合到另一个回合保持不变。
import sched,time
test = 0
s = sched.scheduler(time.time, time.sleep)
Y = 2000
def loop1(sc):
class fb:
def link(self):
global test,Y
test = test + 1
self.X = self.X + 1
print 'Y == %d' % Y
print 'test == %d self.X == %d' % (test,self.X)
print 'id(fb) == %d' % id(fb)
print '--------'
m1 = fb()
m1.X = 0
m1.link()
print
m2 =fb()
m2.X = 1
m2.link()
print
m3 =fb()
m3.X = 0
m3.link()
print '--------'
del fb
# Update loop every 10 second
sc.enter(10, 10, loop1, (sc,))
# end loop
s.enter(1, 1, loop1, (s,))
s.run()
据我所知,您的代码无法按您的意愿工作的原因是定义类的脚本部分称为“类的定义”(难以置信,不是吗? ) 并且当解释器第一次传递这个类块时,它会执行它。
“类定义”的执行创建了一个类对象。创建类后,如果解释器再次通过类的代码块(= 类定义),则不会重新执行“定义”。
这里又出现了一个模棱两可的词:“定义”可以理解为“脚本中定义类的文本块”或“
我用于“类定义”的含义是文档中使用的含义:
类定义,如函数定义(def 语句)必须在它们生效之前执行。(您可以想象将类定义放在 if 语句的分支或函数内。)
http://docs.python.org/2/tutorial/classes.html#class-definition-syntax
所以,最后,我想说的是,在你的代码中,“fb 类的定义”只执行一次,然后总是同一个类是建模类,一个接一个地循环。