我正在尝试在某种类型的数据上使用__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] 举报,一经查实,本站将立刻删除。