通常,Python 只是获取和设置属性的值,而无需任何特殊处理,就像基本存储一样。但是,如果您正在实现Page Objects,其中Base page class 在访问每个页面对象类时被初始化,您可能需要验证正在分配的页面对象的 值。您可能希望检索一个值并将其缓存以供以后使用。
简而言之,descriptor 是具有以下任一方法的属性值:
-
__get__(self, instance, owner):这将在检索到属性时被调用 (value = obj.attr),无论它返回什么都会被提供给请求该属性值的代码。
-
__set__():当一个值被设置为属性 (obj.attr = 'value') 时会调用它,并且根本不应该返回任何东西。
-
__delete__():从对象中删除属性时调用此方法 (del obj.attr)
在描述符协议中。如果为属性定义了这些方法中的任何一个,则称其为descriptor。
调用以获取所有者类的属性(类属性访问)或该类的实例(实例属性访问)。一个例子:
class Ten:
def __get__(self, obj, objtype=None):
return 10
class A:
x = 5 # Regular class attribute
y = Ten() # Descriptor instance
a = A() # Make an instance of class A
print(a.x) # Normal attribute lookup
print(a.y) # Descriptor lookup
打印:
5
10
解释:在a.x 属性查找中,点运算符在类字典中找到'x': 5。在a.y 查找中,点运算符找到一个描述符实例,该实例由其get 方法识别。调用该方法返回 10。请注意,值 10 既不存储在类字典中,也不存储在实例字典中。相反,值 10 是按需计算的。
这个用例
根据element.py中的代码
from selenium.webdriver.support.ui import WebDriverWait
class BasePageElement(object):
"""Base page class that is initialized on every page object class."""
def __set__(self, obj, value):
"""Sets the text to the value supplied"""
driver = obj.driver
WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_name(self.locator))
driver.find_element_by_name(self.locator).clear()
driver.find_element_by_name(self.locator).send_keys(value)
def __get__(self, obj, owner):
"""Gets the text of the specified object"""
driver = obj.driver
WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_name(self.locator))
element = driver.find_element_by_name(self.locator)
return element.get_attribute("value")
class Pages:
element = BasePageElement()
def __init__(self, element, value):
self.element = element # Calls __set__()
self.value = value
login_page = Pages(username, 'Henry') # Sets the username field with text Henry