为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中扩展现有的类实例

在 Python 中扩展现有的类实例

森林海 2022-07-12 14:45:45
我有一个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'我将如何实现这样的事情?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以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成员,当然,该成员可能具有也可能没有所需的属性。


查看完整回答
反对 回复 2022-07-12
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号