Я работаю над пакетом Python для онлайн-систем и начал реализовывать декораторы, которые работают следующим образом:
@Service
class MyCode ():
# This will run once on beginning
def setup (self):
pass
# This will run once on every loop
def main (self):
pass
# This will run on an exclusive thread forever (or until program shuts down)
def loop (self):
pass
и хотел реализовать декоратор Swarm
, например
@Swarm (10)
class MyCode ():
pass
сгенерирует 10 экземпляров MyCode
с именами от MyCode_O
до MyCode_9
, каждый из которых отличается друг от друга.
Мой Service
декоратор отлично работает для отдельных экземпляров, и он вот так:
from copy import deepcopy
class Service ():
def __init__ (self, obj, context = None, name=None):
@wraps(obj)
def init(obj, context = None):
try:
if name:
self.__name = name
else:
self.__name = obj.name
except:
self.__name = obj.__name__
self.__context = context
self.__rawObj = deepcopy(obj)
self.__obj = deepcopy(obj)
self.__obj.__init__(self.__obj)
self.__obj.MSG_VERBOSE = self.MSG_VERBOSE
self.__obj.MSG_DEBUG = self.MSG_DEBUG
self.__obj.MSG_INFO = self.MSG_INFO
self.__obj.MSG_WARNING = self.MSG_WARNING
self.__obj.MSG_ERROR = self.MSG_ERROR
self.__obj.MSG_FATAL = self.MSG_FATAL
try:
self.seed = self.__obj.seed
except:
self.seed = 0
self._active = True
return init(obj, context=None)
Этот self.seed
предназначен только для отладки.
Я пытался реализовать Swarm
вот так:
class Swarm ():
def __init__ (self, size=1, obj=None, context=None):
self.__context = context
self.__services = []
self.__name = "Otools Swarm <None>"
self.__size = size
if obj:
self.__call__(obj)
self._active = True
def __call__ (self, obj, context=None, index=None):
@wraps(obj)
def init(obj, index=0):
obj.__init__(obj)
new_obj = deepcopy(obj)
self.__rawObj = deepcopy(new_obj)
self.__name = new_obj.__name__
new_obj.name = "{}_{}".format(new_obj.__name__, index)
svc = Service(new_obj)
self.__services.append(svc)
for i in range(self.size):
init(obj, i)
for service in self.__services:
print ("SERVICE_DATA:", service.name, service.seed)
print ("OBJ_DATA:", service.obj.name, service.obj.seed)
return self
но потом те print
s покажет мне это:
SERVICE_DATA: SwarmTest_0 2199
OBJ_DATA: SwarmTest_4 2643
SERVICE_DATA: SwarmTest_1 4148
OBJ_DATA: SwarmTest_4 2643
SERVICE_DATA: SwarmTest_2 1438
OBJ_DATA: SwarmTest_4 2643
SERVICE_DATA: SwarmTest_3 1341
OBJ_DATA: SwarmTest_4 2643
SERVICE_DATA: SwarmTest_4 2643
OBJ_DATA: SwarmTest_4 2643
Я пробовал добавлять deepcopy во многих местах, пытался не вызывать __init__
на объекте, и я не знаю, что еще делать.