簡體   English   中英

默認情況下調用父構造函數?

[英]Parent constructor called by default?

我有以下來自 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 ,但是我們沒有在LoginPage類中定義__init__方法。

這是否意味着使用driver參數調用父類PageObject的構造函數? 我認為 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__ s,因此如果你想調用父類構造函數,您必須明確這樣做。

請注意這些類之間的區別:

>>> 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM