如何动态选择python基类?
在python(3)中,我想从几个基类动态创建一个派生类 具体示例:在如何动态选择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_
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,),{})
坦克-但是在第一个选项中我在哪里/如何定义其他类方法?在某种程度上,第一个选项是围绕其他两个的包装器(除了它没有定义子类,但实例化了对象)。我已经对它进行了更新,以显示它如何使用与第二个示例相同的思想在函数中本地定义一个新类。啊,我明白你的意思了。我想说这是同样的方法。不管怎样,你的建议似乎奏效了。。。