gpt4 book ai didi

python - 默认调用父构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:11 24 4
gpt4 key购买 nike

我有来自 python page_object 文档的以下示例:

 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 类中。

这是否意味着父类 PageObject 的构造函数是用 driver 参数调用的?我认为 python 不会隐式调用父级的构造函数?

最佳答案

__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__ 方法,解释器只会调用该方法并且调用所有父类__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>

关于python - 默认调用父构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com