super

super定义

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

 

super语法

#接收两个参数
super(class,self).xxx  # XXX 父类的方法或属性

Python3.x:
     super().xxx    # XXX 父类的方法或属性

Python2.x :
    super(Class, self).xxx :

实例

一般用法

python3.x

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

python2.x

class A(object):   # Python2.x 记得继承 object
    def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super(B, self).add(x)
b = B()
b.add(2)  # 3

指定类方法后的用法

1.1

class A(object):
    def __init__(self):
        self.a = "OK"
        print(self.a)   #OK
        print(self.__name__)   #B

class B(A):
    a = 123    #----类属性
    def __init__(self,a):
        self.a = a      #------对象属性
        print(self.__class__)
    @classmethod   #-----指定为类方法
    def aaa(cls):
        print(cls.a)
        super(B, cls).__init__(cls)   # A.__init__必须接受一个self参数

aa = B(123)   #<class '__main__.B'>
aa.aaa()   # 123  #OK   #B

1.2

class A(object):
    
    def foo1(self):     #对象方法
        print( "Hello",self)
        
    @staticmethod   #静态方法
    def foo2():
        print( "hello")
        
    @classmethod      #类方法
    def foo3(cls):
        print ("hello",cls)


a = A()
# a.foo1() 与 A.foo1(a) 结果相同,不同的表示而已。
a.foo1()       #最常见的调用方式,但与下面的方式相同

A.foo1(a)     #这里传入实例a,相当于普通方法的self

A.foo2()      #这里,由于静态方法没有参数,故可以不传东西

A.foo3()      #这里,由于是类方法,因此,它的第一个参数为类本身。

print(A)      #可以看到,直接输入A,与上面那种调用返回同样的信息。

 

posted @ 2019-02-26 11:17  萤huo虫  阅读(124)  评论(0编辑  收藏  举报