我在python page_object
docs中有以下示例:
from page_objects import PageObject, PageElement
from selenium import webdriver
class LoginPage(PageObject):
username = PageElement(id_='username')
password = PageElement(name='password')
login = PageElement(css='input[type="submit"]')
driver = webdriver.PhantomJS()
driver.get("http://example.com")
page = LoginPage(driver)
page.username = 'secret'
page.password = 'squirrel'
assert page.username.text == 'secret'
page.login.click()
让我感到困扰的是,我们为LoginPage
创建了一个driver
构造函数,但我们还没有在{__init__
中定义LoginPage
方法1}}类。
这是否意味着使用PageObject
参数调用父类driver
的构造函数?我以为python没有隐含地调用父母的构造函数?
答案 0 :(得分:2)
__init__
方法只是一种方法,因此python与其他方法执行相同类型的查找。如果类B
没有定义方法/属性x
,那么python会查找它的基类A
,依此类推,直到它找到属性/方法或失败。
一个简单的例子:
>>> class A:
... def method(self):
... print('A')
...
>>> class B(A): pass
...
>>> class C(B):
... def method(self):
... print('C')
...
>>> a = A()
>>> b = B()
>>> c = C()
>>> a.method()
A
>>> b.method() # doesn't find B.method, and so uses A.method
A
>>> c.method()
C
与__init__
相同:因为LoginPage
没有定义__init__
python查找PageObject
类并在那里找到它的定义。
当我们说“python不会隐式调用父类构造函数”时,如果你定义一个__init__
方法,那么解释器只会调用该方法和 not 调用所有父类__init__
,因此如果要调用父类构造函数,则必须明确地这样做。
注意这些类之间的区别:
>>> class A:
... def __init__(self):
... print('A')
...
>>> class B(A):
... pass
...
>>> class B2(A):
... def __init__(self):
... print('B')
...
>>> class B3(A):
... def __init__(self):
... print('B3')
... super().__init__()
...
>>> A()
A
<__main__.A object at 0x7f5193267eb8>
>>> B() # B.__init__ does not exists, uses A.__init__
A
<__main__.B object at 0x7f5193267ef0>
>>> B2() # B2.__init__ exists, no call to A.__init__
B
<__main__.B2 object at 0x7f5193267eb8>
>>> B3() # B3.__init__exists, and calls to A.__init__ too
B3
A
<__main__.B3 object at 0x7f5193267ef0>