python和别的面向对象编程語言相近,每一个类能够有着一个或是好几个父类,他们从父类那边承继了特性和方式。假如一个方式在子类的案例中被启用,或是一个特性在子类的案例中被浏览,可是该方式或特性在子类中并不会有,那麼便会全自动的去父亲类中开展搜索。

承继父类后,就能启用父类方法和浏览父类特性,而要进行全部集成化全过程,子类是必须启用的构造方法的。

子类不显式启用父类的构造方法,而父类构造方法复位了一些特性,便会出現难题

假如子类和父类都是有构造方法,子类实际上是调用了父类的构造方法,如果不显式启用父类构造方法,父类的构造方法就不容易强制执行,造成 子类案例浏览父类复位方式中原始的自变量便会出現难题。

先讨论一下以下实例:

编码以下:class A:

def __init__(self):
self.namea=”aaa”
def funca(self):
print “function a : %s”%self.namea
class B(A):
def __init__(self):
self.nameb=”bbb”
def funcb(self):
print “function b : %s”%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()

运作結果:

编码以下:

bbb
function b : bbb
Traceback (most recent call last):
File “D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py”, line 19, in module
print b.funca()
File “D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py”, line 6, in funca
print “function a : %s”%self.namea
AttributeError: B instance has no attribute ‘namea’

在子类中,构造方法被调用,但新的构造方法沒有一切有关复位父类的namea特性的编码,为了更好地做到预估的实际效果,子类的构造方法务必启用父亲类的构造方法来开展基础的复位。有二种方式能做到这一目地:启用超类构造方法的未关联版本号,或是应用super涵数。

方式一:启用未关联的超类构造方法

改动编码,多增一行:

编码以下:class A:

def __init__(self):
self.namea=”aaa”
def funca(self):
print “function a : %s”%self.namea
class B(A):
def __init__(self):
#这一行解决了难题
A.__init__(self)
self.nameb=”bbb”
def funcb(self):
print “function b : %s”%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()

如上面有注解的一行解决了该难题,立即应用父类名字启用其构造方法就可以。

这类方式称为启用父类的未关联的构造方法。在启用一个案例的方式时,该方式的self主要参数会被全自动关联到案例上(称之为关联方式)。但假如立即启用类的方式(例如A.__init),那麼就沒有案例会被关联。那样就可以随意的出示必须的self主要参数,这类方式称之为未关联unbound方式。

根据将当今的案例做为self主要参数出示给未关联方式,B类就能应用父亲类构造方法的全部完成,进而namea自变量被设定。

方式二:应用super涵数

改动编码,此次必须提升在原先编码上提升2行:

编码以下:#父类必须承继object目标

class A(object):
def __init__(self):
self.namea=”aaa”
def funca(self):
print “function a : %s”%self.namea
class B(A):
def __init__(self):
#这一行解决困难
super(B,self).__init__()
self.nameb=”bbb”
def funcb(self):
print “function b : %s”%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()

如上面有注解的为增加的编码,在其中第一句让类A承继自object类,那样才可以应用super涵数,由于它是python的“新型类”适用的特点。当今的雷和目标能够做为super涵数的主要参数应用,调用函数回到的目标的一切方式全是启用超类的方式,而不是当今类的方式。

super涵数会回到一个super目标,这一目标承担开展方式分析,分析全过程其会全自动搜索全部的父类及其父类的父类。

方式一更形象化,方式二能够一次复位全部超类

super涵数比在超累中立即启用未关联方式更形象化,可是其较大 的有点儿是假如子类承继了好几个父类,它只必须应用一次super涵数就可以。殊不知要是没有这一要求,立即应用A.__init__(self)更形象化一些。