2015-07-06 3 views
2

Использование Python/Selenium, у меня есть много объектов страницы, которые будут возвращать друг другу, следуя ссылке. Это работает отлично, но для удобства я хотел бы постоянно вызывать методы на одной и той же переменной, не переназначая ее.Метод 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.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

Если вы хотите изменить поведение некоторых методов вашего класса, но не намерены изменить тип класса, то вы можете быть заинтересованы в государстве (Design) Шаблон.

Например, если вы хотите изменить идентификатор, в зависимости от текущего идентификатора, у вас будет по два разных класса для каждой функциональности. В псевдокоде это работает так:

class BasicIdentity 

    Identity identityA; 
    Identity identityB; 

    Identity currentIdentity; 

    void PrintIdentity() 
    { 
     currentState.printIdentity() 
    } 

    void ChangeIdentity() 
    { 
     if currentIdentity == identityA 
      currentIdentity = identityB 
     else 
      currentIdentity = identityA 
    } 
Смежные вопросы