2015-07-06 62 views
2
自己的類

使用Python /硒,我有很多頁面對象下面的鏈接時將返回對方。這是完美的,但爲了方便起見,我想不斷調用同一個變量的方法而不重新分配它。Python的方法改變

的玩具下面的例子:

class Foo(object): 
    identity = 'foo' 
    def __init__(self, key): 
     self.key = key 
    def change(self): 
     return Bar(self.key) 

class Bar(object): 
    identity = 'bar' 
    def __init__(self, key): 
     self.key = key 
    def change(self): 
     return Blah(self.key) 

class Blah(object): 
    identity = 'blah' 
    def __init__(self, key): 
     self.key = key 
    def change(self): 
     return Foo(self.key) 

x = Foo('somekey') 
x.identity # > 'foo' 
x.key # > 'somekey' 
x = x.change() 
x.identity # > 'bar' 
x.key # > 'somekey' 

我想保持作用在返回的對象不重新分配X,如:

x.change().identity # > 'blah' 
x.identity # > *should* result in 'blah', not 'bar' 

我收集我需要某種容器類即會將所有方法調用委託給一個子變量,並重新分配它。但是,我無法弄清楚如何。我想它的工作原理是這樣的:

x = SomeContainer(Foo, 'otherkey') 
x.change().change() 
x.key # > 'otherkey' 
x.identity # > 'blah' 
x.change() 
x.identity # > 'foo' 
+4

給我的感覺是,如果你得到這個工作,你會再想要適應它改變成任意對象,你知道它之前,你會正在調用像'x.become(y)'這樣的函數,你甚至不會注意到你剛剛重新創建了變量。 – user2357112

+0

你爲什麼不想重新分配?應該沒有理由不這樣做。 – JDrost1818

+0

我可以重新分配,如果有其他選擇,我只是好奇。一旦webdriver導航到新頁面,舊頁面對象就沒用了。很少/沒有它的命令可以工作,很少/沒有它的元素存在,並且驗證失敗。 –

回答

0

如果你想改變你的類的一些方法的行爲,但不打算改變類的類型,那麼你可能會感興趣的國家(設計)模式。

例如,如果你想改變身份,根據當前的身份,你就必須爲每一個功能的兩個不同的班級。 在僞代碼它的工作原理是這樣的:

class BasicIdentity 

    Identity identityA; 
    Identity identityB; 

    Identity currentIdentity; 

    void PrintIdentity() 
    { 
     currentState.printIdentity() 
    } 

    void ChangeIdentity() 
    { 
     if currentIdentity == identityA 
      currentIdentity = identityB 
     else 
      currentIdentity = identityA 
    }