Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何动态选择python基类?_Python_Selenium_Inheritance - Fatal编程技术网

如何动态选择python基类?

如何动态选择python基类?,python,selenium,inheritance,Python,Selenium,Inheritance,在python(3)中,我想从几个基类动态创建一个派生类 具体示例:在selenium中,为了运行基于GUI的测试,您可以通过以下方式从Firefox或Chrome启动驱动程序: driver = webdriver.Firefox() driver = webdriver.Chrome() 现在,我想创建一个派生类,向其中添加额外的功能。差不多 class MyDriver(webdriver.Firefox): def find_button_and_click_on_it_no_

在python(3)中,我想从几个基类动态创建一个派生类

具体示例:在
selenium
中,为了运行基于GUI的测试,您可以通过以下方式从Firefox或Chrome启动驱动程序:

driver = webdriver.Firefox()
driver = webdriver.Chrome()
现在,我想创建一个派生类,向其中添加额外的功能。差不多

class MyDriver(webdriver.Firefox):
    def find_button_and_click_on_it_no_matter_what(self, params):
        ...
但是基类可以是firefox驱动程序或chrome驱动程序。我发现了一些相关的东西,但似乎不起作用:

class MyDriver(object):
    def __new__(cls, base_type, *args, **kwargs):
        return super(HBPDriver, cls).__new__(base_type, *args, **kwargs)

    def __init__(self):
        pass
调用此命令

driver = mydriver.MyDriver(webdriver.Firefox())    
给出一个错误

TypeError: object.__new__(X): X is not a type object (WebDriver)
如何做对?以及如何在派生类上调用
\uuuuu init\uuuu


我希望我想要实现的目标已经很清楚了…

当你调用
\uuuuu new\uuuu
时,选择要实例化的类已经太晚了
\uuuu new\uuuu
是类的一个属性。相反,您需要一个简单的工厂函数:

def my_driver(cls, *args, **kwargs):
    class NewThing(cls):
        ...
    return NewThing(*args, **kwargs)

ff = my_driver(webdriver.Firefox)
另一个选项是使用表达式定义基类:

if ...:
  base = webdriver.Firefox
elif ...:
  base = webdriver.Chrome
class MyDriver(base):
    ...
第三种选择是跳过
class
语句,直接使用
type
,尽管我不建议这样做,除非class语句的主体是空的

class MyDriver(base):
    pass

相当于选项的
MyDriver=type('MyDriver',(base,),{})

坦克-但是在第一个选项中我在哪里/如何定义其他类方法?在某种程度上,第一个选项是围绕其他两个的包装器(除了它没有定义子类,但实例化了对象)。我已经对它进行了更新,以显示它如何使用与第二个示例相同的思想在函数中本地定义一个新类。啊,我明白你的意思了。我想说这是同样的方法。不管怎样,你的建议似乎奏效了。。。