微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过实现__get__描述符编写瘦对象代理

我正在尝试在某种类型的数据上使用__get__描述符创建一个思想代理,以便客户端代码可以方便地使用它(最佳示例显示):

class Value(object):
    def __init__(self, val):
        self.val = val
    def __get__(self, instance, owner):
        return self.val

class Container(object):
    x = Value(1)
    y = [ Value(2), Value(3) ]

c = Container()
assert c.x == 1
assert c.y[0] == 2 # fails.

现在,我主要了解为什么它会失败,所以我想知道是否有更好的方法来实现我的目标,即包装数据,以便在客户端访问数据时,他们仅需要直接访问Value对象(实际上, __get__方法会在返回self.val之前对其进行处理)

细节

我要解决的实际情况是实用程序代码,以帮助编写PageObjects&硒测试用例的PageElements.我想为测试作者提供一种干净而简单的方式来编写以下形式的PageObjects:

class MyLogin(PageObject):
    username_text_Box = PageElement(By.ID, "username")
    password_text_Box = PageElement(By.ID, "password")
    submit_button = PageElement(By.CLASS_NAME, "login-button")

driver = webdriver.Firefox()
driver.get("http://mypage.com")
login_page = MyLogin(driver)
login_page.username_text_Box.send_keys("username01")
login_page.password_text_Box.send_keys("XXXX")
login_page.submit_button.click()

我试图将获取实际的WebElement的业务封装在PageElement类中,并且我希望允许客户端一旦访问PageElement对象,就可以访问WebElement.能够使用列表,词典可帮助使PageObject实例更清晰并对相关的PageElements进行分组.

解决方法:

如果还要代理阵列访问器,则需要添加其他代理.这是一个对x使​​用property()的示例,因为它只是一个属性,而对y使用数组代理访问器.

self._x和self._y是真正值的内部私有访问器

import functools

class array_proxy(object):
    def __init__(self, accessor):
        self.accessor = accessor

    def __getitem__(self, key):
        return self.accessor(key)

class Value(object):
    def __init__(self, val):
        self.val = val

class Container(object):
    def __init__(self):
        self.__x = Value(1)
        self.__y = [Value(2), Value(3)]
        self.y = array_proxy(functools.partial(Container.get_y_element, self))

    @property
    def x(self):
        val = self.__x.val
        # do stuff with val
        return val

    def get_y_element(self, key):
        val = self.__y[key].val
        # do stuff with val
        return val


c = Container()
assert c.x == 1
assert c.y[0] == 2

如果您可以强迫其他人直接使用get_y_element,则代理它会更简单一些,并且对于用户来说,访问它们时会发生什么是更加明确的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐