控制对象的某些方法,以一定间隔执行(不是每次都执行)
场景:有些设备并不需要每次执行reset。这样可以外部控制间隔多少次执行一次;另外有时候会同时用到好几台设备,所以要保证每台设备都是间隔执行reset。
如果有类似的场景可以做参考。
每次会创建1/2/4(obj_num )个对象,用完就销毁。但是每个对象的某个方法(reset)不是每次都执行,而是间隔几轮(step)被真正执行。这个间隔次数需要能够由外部控制。
假如step=4,意思每4次有1次对应那个对象的方法(这里是reset)就被激活调用,否则略过。
初步实现如下(如果有更好方法欢迎交流,一起优化):
class A:
reset_counter = 0 # 当前是第几次生成对象
step = 4 # 间隔多少次开始除余处理
remainders = [1] # 余数范围
def __init__(self, name):
self.name = name
def __str__(self):
return f"{self.name}"
def reset(self):
A.reset_counter += 1 # 这里必须用A.
if A.reset_counter % A.step in A.remainders: # 这里调用可以用self.或者A.
print(f"\033[32;1m{self} 执行reset(每{A.step}次 reset 1次,这是第 {A.reset_counter} 次)\033[0m")
else:
print(f"\033[35;1m{self} 不执行reset(每{A.step}次 reset 1次,这是第 {A.reset_counter} 次)\033[0m")
def main():
obj_num = 2 # 1 2 4 一次生成几个对象
step = 4 # 求余的步长(还需要乘以obj_num)
real_step = step * obj_num # (乘以obj_num)
remainders = list(range(1, obj_num + 1)) # reset的情况:余数限定于列表中的值(一般是obj_num的数量,这样每次生成的对象都会同步间隔step次后reset一次)
A.reset_counter = 0 # 每次更新了obj_num和step后可以重新更新!
A.step = real_step
A.remainders = remainders
for i in range(100):
obj_list = []
for j in range(obj_num):
obj_i = A(str(i * obj_num + j))
obj_list.append(obj_i)
for obj_i in obj_list:
obj_i.reset()
del obj_list
if __name__ == '__main__':
main()
结果:
1,obj_num = 1 # 1次用到1个设备
2,obj_num = 2 # 1次用到2个设备
3,obj_num = 4 # 1次用到4个设备