【问题标题】:What is the proper way to construct class, object in python在python中构造类、对象的正确方法是什么
【发布时间】:2017-04-13 02:06:33
【问题描述】:

如果我有多个类,如 Page 类、Page1 类、Page2 类,需要使用相同的 Element 类。为了让 self.driver 在 ELement 类上使用,我需要在每个 class Page 上复制从 class Ele(e)class itemWrap 的大量代码,以将 self.driver 作为输入传递。我构造以下代码的最佳方法是什么?

# elements.py
class Element(object):

    def addItem(self, owner=None):
        for _i in owner:
            options = self.findAvaItem()
            i = options.index(_i)
            self.ele.find_element_by_xpath('{}/{}'.format(self.l, i)).click()

    def delItem(self, owner=None):
        for _i in owner:
            options = self.findSelecItem()
            i = options.index(_i)
            self.ele.find_element_by_xpath('{}/{}'.format(self.l, i)).click()

    def findAvaItem(self):
        _o = self.driver.find_element_by_css_selector('css==div.menu.transition.visible').text
        return _o.split('\n')

    def findSelecItem(self):
        _o = self.driver.find_element_by_css_selector('css==a.ui.label')
        return [i.text for i in _o]

# BasePage.py
class BasePage(object):

    def __init__(self, driver):
        self.driver = driver

# Page.py
from elements import Element as e

class Ele(e):
    def __init__(self, driver, _t):
        self.driver = driver
        self.l = 'element l variable'
        self.t = _t

class itemWrap(object):

    def __init__(self, driver, _type):
        self.ele = Ele(driver, _type)
        self.driver = driver
        self.t = _type

    def sel_item(self, _value):
        self.ele.addItem(_value)

    def desel_item(self, _value):
        self.ele.delItem(_value)

class Page(BasePage):
    def inputItem(self, _type, _value):
        itemWrap(self.driver, _type).sel_item(_value)

    def removeItem(self, _type, _value):
        itemWrap(self.driver, _type).desel_item(_value)

# Test.py
from Page import Page
from selenium import webdriver as WebDriver

class Test(object):

    @classmethod
    def setup_class(cls):
        if hasattr(super(Test, cls), 'setup_class'):
            super(Test, cls).setup_class()
        cls.driver = WebDriver(desired_capabilities=chrome, command_executor='127.0.0.1')

    def check_function(self):
        self.Page.inputItem('typeA', ['item A1', 'item A2', 'item A3'])
        self.Page.removeItem('typeA', ['item A1', 'item A2', 'item A3'])
        self.Page.inputItem('typeB', ['item B1', 'item B2'])
        self.Page.removeItem('typeB', ['item B1', 'item B2'])

【问题讨论】:

    标签: python python-2.7 python-3.x class subclass


    【解决方案1】:

    您似乎正试图在您的itemWrap 类中构建一个外观层,以便itemWrap 的每个方法只传递对self.ele 的调用。这是正确的吗?

    如果是这样,您可以动态生成函数。 (如果在 wrap-method 与 element-method 名称中存在一致的文本模式,您可以做更多的自动化操作。事实上,您必须提供一个 dict。)

    class Ele:
        def addItem(self, x):
            print("Additem",x)
        def delItem(self, x):
            print("DelItem",x)
    
    class ItemWrap:
        def __init__(self, ele):
            self.ele = ele
    
        method_map = {
            'sel_item': 'addItem',
            'desel_item': 'delItem',
            # more methods go here
        }
    
    for myname, elname in ItemWrap.method_map.items():
        msrc = "def {}(self, _value):\n" \
               "    return self.ele.{}(_value)\n".format(myname, elname)
        gbls = {}
        exec(msrc, gbls)
        setattr(ItemWrap, myname, gbls[myname])
    
    e = Ele()
    i = ItemWrap(e)
    i.sel_item(10)
    i.desel_item(11)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2017-12-26
      • 1970-01-01
      • 2018-12-09
      相关资源
      最近更新 更多