Python方法改变自己的类

时间:2015-07-06 02:00:49

标签: python oop selenium-webdriver

使用Python / Selenium,我有很多页面对象在链接后会互相返回。这非常有效,但为了方便起见,我想在不重新分配相同变量的情况下不断调用方法。

以下玩具示例:

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'

1 个答案:

答案 0 :(得分:0)

如果你想改变你班级某些方法的行为,但不打算改变班​​级的类型,那么你可能会对州(设计)模式感兴趣。

例如,如果您想要更改标识,则根据当前标识,每个功能都有两个不同的类。 在伪代码中它的工作方式如下:

class BasicIdentity

    Identity identityA;
    Identity identityB;

    Identity currentIdentity;

    void PrintIdentity()
    {
        currentState.printIdentity()
    }

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