按实例管理类

时间:2014-05-22 12:43:54

标签: python decorator

我做了一个复杂的课程,现在我必须跟踪它并将其注册在更大的班级中进行管理。

问题在于复杂类可能会创建自己的新实例。因此,我必须在我的经理中检测到这个新创作。

另一个问题是,不仅有一名经理。他们像会话管理员一样使用。每个都有一个初始的复杂对象。如果复杂对象实例化了自身的新实例,则只需要警告好的管理器。

以下是展示我的问题的代码示例:

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

3 个答案:

答案 0 :(得分:1)

草拟一个想法(不完整/未经测试):

  1. 将经理作为参数提供:Foo.__init__(self, manager)并将其存储为属性
  2. 您必须在init_object = Foo(self)
  3. 中致电Manager.__init__()
  4. 然后,您可以在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__的用途是什么,不是吗?

https://stackoverflow.com/a/13054570/705086