2014-05-22 77 views
0

我做了一個複雜的課,現在我必須跟蹤它並將其註冊到一個更大的班級進行管理。通過實例管理課程

問題是,複雜類可能會創建自己的新實例。因此,我必須在我的經理中發現這個新的創造。

另一個問題是,不只有一個經理。它們像會話管理器一樣使用。每個對象都有一個初始複雜對象。如果複雜對象實例化自己的新實例,則只有好的管理器必須被警告。

這裏提出我的問題的代碼示例:

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

TBH我不確定你在這裏問什麼......如果你問一些更具體的問題會有幫助嗎? –

+0

類* Foo *是一個樹節點,可以創建新節點作爲新的子節點。我想通過上下文(Manager)保存新節點的創建。Manager和Foo之間沒有邏輯聯繫,所以我不認爲編輯Foo類是好的。 * Manager *類用於加載/保存樹並在我的架構中添加服務層。 – TurpIF

+0

第二個斷言應該是m1對嗎? –

回答

1

只是勾畫出一個想法(不完全/未經測試):

  1. 提供經理的參數:Foo.__init__(self, manager)並將其存儲爲屬性
  2. 你必須調用init_object = Foo(self)Manager.__init__()
  3. 然後,您可以使用您的create_another()方法中有關經理的信息來
    • 實例化的新實例正確
    • 修改Manager.objects -list(我會建議,而不是照片直接修改它的方法)
+0

* Foo *和* Manager *之間沒有邏輯關係。我真的不想改變* Foo *類。使用裝飾器不是問題 – TurpIF

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對象幾次,等...

+0

事實上,我的示例代碼並不是我的項目><中的真實案例。 * create_another *不會返回任何東西(實際上它是知道操作成功的bool)。我猜裝飾者重新定義了Foo對象的'__init__'或'__new__'。但我不知道如何 – TurpIF