1.父类中已经有init模块,子类继承父类后,无需再初始化(init),实例化子类时,会自动调用父类定义的init【父亲盖了一楼,儿子想造房子就不需要再盖一楼了】
2.父类中已经有init模块,子类继承父类后需要扩展父类行为,需要子类重写init,子类重写init,实例化子类,就不会调用父类已经定义的init【父亲盖了一楼,儿子想造二楼,需要先继承一楼再建二楼-->重写】
重写init,要显示调用父类的init方法,有以下两种调用方式:案例带有初始化参数的父类
- 调用未绑定的父类构造方法
Base 父类初始化带有driver参数
class Base(object):
def __init__(self, driver):
self.driver = driver
def find(self, *loc):
try:
t = WebDriverWait(self.driver, 10).until(
lambda x: x.find_element(*loc))
return t
except:
print("%s 页面中不能找到 %s 元素" %self, loc)
class Fin_plus(Base): # 子类继承父类Base
def __init__(self, driver):
# 必须显式调用父类的构造方法,否则不会执行父类构造方法
Base.__init__(self, driver)
- super继承:使用super需要继承object对象,属于新式类。super函数会返回一个super对象 ,这个对象负责进行方法解析,解析过程中会自动查找所有父类以及父类的父类。
优势:如果子类继承了多个父类,它只需要使用一次super函数就可以。
Base 父类初始化带有driver参数(与上述案例一致)
class Fin_plus(Base):
def __init__(self, driver, loc): # 子类中扩展了loc参数
super(Base, self).__init__(driver) # 使用super函数调用父类的构造方法
self.loc = loc # 定义loc参数
def fin_plus(self):
self.find(self.loc) # find是Base 父类定义的一个方法
扩展后,这里调用子类Fin_plus,子类实例化时,需要传 driver, loc两个参数
