【发布时间】:2020-05-05 18:05:46
【问题描述】:
我正在为在线系统开发一个 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
但是那些prints 告诉我这个:
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__,我不知道还能做什么。
【问题讨论】:
-
看起来您希望装饰器将
__init__方法添加到它作为参数接收的类,而不是类本身。
标签: python python-3.x instance deep-copy