gpt4 book ai didi

python - 在 Python 中扩展现有的类实例

转载 作者:行者123 更新时间:2023-12-04 10:39:56 24 4
gpt4 key购买 nike

我有一个对象 element这是由另一个类方法返回的,我不一定有权更改。

>>> from selenium.webdriver import Chrome
>>> browser = Chrome()
>>> browser.get('https://www.google.com')
>>> element = driver.find_element_by_tag_name('input')
>>> type(element)
<class 'selenium.webdriver.remote.webelement.WebElement'>

我有一个单独的类来扩展元素的功能。
>>> class Input:
>>> def __init__(self, element):
>>> assert element.tag_name == 'input', 'Element must be of type "input"'
>>> self.element = element
>>> self.browser = element.parent
>>> def is_enabled(self):
>>> return self.element.is_enabled()
>>> @property
>>> def value(self):
>>> return self.element.get_attribute('value')

目前我使用它的方式是通过 element进入类:
>>> input = Input(element)
>>> input.is_enabled() # Same as input.element.is_enabled()
True

我希望能够更轻松地访问原始对象的属性,而不必在调用中指定它。例如:

取而代之的是:
>>> input.element.tag_name
'input'

做这个:
>>> input.tag_name
'input'

我将如何实现这样的事情?

最佳答案

您可以转换您的 Input类通过实现 __getattr__() 成为代理方法,如 Container下面类:

class Example:
def __init__(self):
self.tag_name = 'name'
def foo(self):
return 'foo'
def bar(self, param):
return param

class Container:
def __init__(self, contained):
self.contained = contained

def zoo(self):
return 0

def __getattr__(self, item):
if hasattr(self.contained, item):
return getattr(self.contained,item)
#raise item

c = Container(Example())
print(c.foo())
print(c.bar('BAR'))
print(c.tag_name)

输出:
foo
BAR
name
Container类现在将任何未知属性访问转发到其 contained成员,当然,可能有也可能没有必需的属性。

关于python - 在 Python 中扩展现有的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com