我做了一个复杂的课程,现在我必须跟踪它并将其注册在更大的班级中进行管理。
问题在于复杂类可能会创建自己的新实例。因此,我必须在我的经理中检测到这个新创作。
另一个问题是,不仅有一名经理。他们像会话管理员一样使用。每个都有一个初始的复杂对象。如果复杂对象实例化了自身的新实例,则只需要警告好的管理器。
以下是展示我的问题的代码示例:
class Foo:
def create_another(self):
# Do something
return Foo()
class Manager:
def __init__(self):
init_object = SomeDecorator(Foo()) # I guess there will be a decorator
self.objects = [init_objects]
m1 = Manager()
assert len(m1.objects) == 1
m1.objects[0].create_another()
assert len(m1.objects) == 2
m2 = Manager()
assert len(m1.objects) == 2
assert len(m2.objects) == 1
m1.objects[0].create_another()
assert len(m1.objects) == 3
assert len(m2.objects) == 1
m2.objects[0].create_another()
assert len(m1.objects) == 3
assert len(m2.objects) == 2
答案 0 :(得分:1)
草拟一个想法(不完整/未经测试):
Foo.__init__(self, manager)
并将其存储为属性init_object = Foo(self)
Manager.__init__()
create_another()
方法中使用有关经理的信息
Manager.objects
- 列表(我建议使用方法而不是修改方法)答案 1 :(得分:0)
如果您的Foo
个对象一次只能由一位经理跟踪,可以通过在致电create_another
时通知它来完成。
示例代码:
class Foo:
def __init__(self, manager=None):
self.manager = manager
def create_another(self):
# do something
foo = Foo(self.manager)
if self.manager is not None:
self.manager.notify_object_created(foo)
return foo
class Manager:
def __init__(self):
init_object = SomeDecorator(Foo(self))
self.objects = [init_object]
def notify_object_created(self, foo):
self.objects.append(foo)
阅读评论后编辑:
如果您不想更改Foo类,另一个解决方案是通过跟踪来动态修饰Foo的构造函数,并将上述功能添加到其中。
示例代码:
class Foo:
def create_another(self):
# do something
return Foo()
class Manager:
def __init__(self):
self.objects = []
self.track(Foo())
def track(self, foo):
def decorated_create_another():
new_foo = foo._create_another()
self.track(new_foo)
return new_foo
foo._create_another = foo.create_another
foo.create_another = decorated_create_another
self.objects.append(foo)
当然,这不会检查是否覆盖了现有的 _create_another 方法,多次跟踪相同的Foo对象等等...
答案 2 :(得分:-2)
__new__
的用途是什么,不是吗?