Python每日小结(九)

来源:互联网 发布:华为移动数据丢失 编辑:程序博客网 时间:2024/06/06 10:46

        今天我们来学习一个比较有用的方法(类),叫做super。为什么要学习这个方法?这个方法有什么用?

        比如说,我们在写一个类,现在要调用其父类的某个方法,在Python2.2之前,通常是这样写的:

class A:    def __init__(self):        print "A"        print "~A"class B(A):    def __init__(self):        print "B"        A.__init__(self)        print "~B"b=B()

        运行结果:

       

        上面这种做法是,通过类名A来引用其方法__init__(),然后传入对象self,从而调用父类A。这样做的缺点很明显,比如说,我们在子类B中多次调用了父类A的方法,则当我们想要更改父类,即想要使B继承C,则需要去读整个代码,将所有的类似调用全都更改过来。所以从Python2.2开始,Python添加了一个关键字super,专门用于解决这个问题:

        super(type[, object-or-type])

        该方法将返回type的超类,值得注意的是,super()仅仅对新式类可用,也即继承object的类。举例来看一下:

class A(object):    def __init__(self):        print "A"        print "~A"class B(A):     def __init__(self):         print "B"         super(B,self).__init__()         print "~B"b=B()
        与上面不同的是,这里的A是继承于object的,也就是说A是新式类。在使用super之后,如果我们想要修改B的父为C,则只需要更改为:

class A(object):    def __init__(self):        print "A"        print "~A"class B(C):     def __init__(self):         print "B"         super(B,self).__init__()         print "~B"b=B()
        也即,将class B(A)更改为class B(C)即可。总的来说,我们可以这样使用super:

class B(C):    def func(self,arg)        super(B,self).func(arg)
        哦,对了,准确地说,super并不是一个函数,而是一个类名,super(B,self)实际上调用了super类的初始化函数,产生了一个super对象,而这个初始化函数并没有做什么神奇的事情,仅仅只是简单地记录了类类型和具体实例,关于多重继承这里就不赘述了,有兴趣可以参考Python super()。