默认调用父构造函数?

问题描述 投票:0回答:2

我有来自 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 不会隐式调用父级的构造函数?

python oop selenium selenium-webdriver
2个回答
10
投票

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

0
投票

我的子类有一个不带参数的构造函数。我的父类有一个带有 2 个参数的构造函数。当我创建子实例时,我可以看到父构造函数首先运行。这能解决您的问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.