首先来一个Python类继承的例子:
class A:
def __init__(self):
print “enter A”
print “leave A”
class B(A):
def __init__(self):
print “enter B”
A.__init__(self)
print “leave B”if __name__ == ‘__main__’:
t = B()输出:
enter B
enter A
leave A
leave B
如果B类在继承A类之后不重写A类的init方法,那么在B类中是不需要显式调用A类的init方法的,B类会自动初始化A类的init方法。
Python的类分为经典类和新式类。
经典类:python2.2之前的类,它到python2.7还能兼容,到3.0之后就只承认新式类了。经典类是默认没有派生自某个基类的
新式类:python2.2之后的类,它的特征就是如果一个类没有特意指明派生至那个类,那么默认继承object基类。
经典类和新式类的区别:
1、默认继承的基类不同,上面有讲。
2、涉及到多重继承的时候顺序不一样,经典类采用从左到右深度优先的匹配原则,而新式类采用C3算法进行顺序计算,具体的C3算法是怎样的,可以通过__MRO__和instance.mro()来打印出来体验下。这也是由于经典类在多重继承上存在问题,为了解决这个问题,所以引进了C3算法。
3、新式类加入property和super等用法,极大提高了python编程效率。
Super使用
看例子:
class Parentclass(object):
def __init__(self):
self.parent = ‘I\’m the parent.’
print ‘Parent’def bar(self,message):
print message,’from Parent’class Childclass(Parentclass):
def __init__(self):
super(Childclass,self).__init__()
print ‘Child’
def bar(self,message):
super(Childclass, self).bar(message)
print ‘Child bar fuction’
print self.parent
if __name__ == ‘__main__’:
Child = Childclass()
Child.bar(‘HelloWorld’)
可以从例子里看到,这是一个python的新式类的继承,继承自object,在子类中,通过super方法显式调用父类中的方法,super(Childclass,self)其实就相当于一个父类的实例。super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
需要注意的一点,就是使用super,需要保持一致性,也就是一个地方使用了super,那么在其他地方涉及到子类中调用父类方法的时候,都要使用super来调用。