# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#超类01

#它是一个内建类型,用于访问属于某个对象超类特性

print super#<type 'super'>

#如果已习惯于通过直接调用父类将self作为第一参数来访问的特性,可能会出现混乱

#经典方法

class M(object):

def s(self):

print u'不是超类方法'

class S(M):

def s(self):

M.s(self)

print u'只是在继承而已'

a=S()

a.s()

"""

不是超类方法

只是在继承而已

"""

#看下M.s(self)这一行,使用刚刚描述的方法调用超类(M类)中的s方法,将self作为第一参数传入,这意味着属于M的s()方法将被调用,但是调用它的实例将返回self

#super使用如下:

class S1(M):

def s(self):

super(S1,self).s()

print u'使用超类super()'

#注意:当多继承模式时,super()将会变得难以使用,应该理解方法解析顺序(MRO)

#理解python方法解析顺序(MRO)

"""

在2.3中添加了基于为dylan构建的mro(http://www.opendylan.org),即c3新的mro

michele simionato所编写的参考文档在www.python.org/download/releases/2.3/mro 上面可以找,它描述C3构建一个类的线性化(优先级,即祖先的一个排序列表)

这个列表被用于特性的查找

mro的变化用于解决创建公用基本类型(object)所引入的问题,在变成C3线性方法之前,如果一个类有2个祖先,mro计算将很简单,如下:

图片:

"""

class C1:pass

class C2:

def m(self):

print 'C1+C2'

class C3(C1,C2):pass

c3=C3()

c3.m()#C1+C2

#当c3.m被调用时,解释程序将查找C3的方法,然后在C1中查找,最后在C2查找

"""

在2个基类之上引用BaseBase类(C1,C2都从其继承,如图:)

结果是,根据《从左到右深度优先》的规则的旧MRO,在C2中查找将通过C1类返回到顶部

看下面的代码将出现一种古怪的情况

"""

class BaseBase:

def methond(self):

print 'BaseBase'

class B1(BaseBase):

pass

class B2(BaseBase):

def methond(self):

print 'B2'

class MB(B1,B2):

pass

a=MB()

a.methond()#BaseBase

"""

这样的继承很少见,所以这更多是一个理论问题而不是实践问题,标准程序库不会构建这样的继承层次结构,但是由于在类型层次顶部引入了object,语言C边(C side)突然出现了多重继承性问题,从而导致了在进行子类型化时冲突

,因为使用已有的MRO使他正常的工作要花费更多精力,所以提出一个新的MRO

"""

#新的

class A(object):

def m(self):

print 'A'

class A1(A):

pass

class A2(A):

def m(self):

print 'A2'

class A3(A1,A2):

pass

a=A3()

a.m()#A2

#(object)新的mro基于一个基类之上的递归调用,如下:**(重点:L[A3(A1,A2)]=A3+merge(L[A1],L[A2],A1,A2))

"""

L[A3]是A3类的线性化,而merge是合并多个线性化结果的具体算法

C的线性化是C加上父类的线性化和父类列表合并的总和

merge算法负责删除重复项并保持正确的顺序,其在文章中描述为

取第一个列表的头,也就是L[A1][0],如果这个头不在任何表的尾部,那么将它加到A3线性化中,并且从合并中列表删除,否则查找下一个列表的头,如果是个好的表头

则取用它

然后重复该操作,直到所有类被删除或者不能找到好的表头,上面的例子中,构建合并是不可能的,2.3将拒绝创建A3关类将抛出一个异常

a(表头)是列表的第一个元素,而tail(表尾)则包含其余元素,比如在(A1,A2,AN...)中,A1是表头,(A2,....,AN)则是表尾

换句话说,C3在每个父类上进行递归尝试查找以获得列表顺序,然后当一个类涉及多个列表时,计算一个从左到右的规则使用层次二义性消除来合并所有的列表

如下:

"""

def L(K):

return [K.__name__ for K  in K.__mro__]

print L(A3)#['A3', 'A1', 'A2', 'A', 'object']

#注意:

"""

类的_mro_的特(只读)用来存储线性化计算结果,计算将在类定义载入时完成

还可能调用A3.mro()来计算并获取结果

提醒:这个只对新风格类起作用,所以在代码库中混杂新旧形式的类并不是好方法,MRO表现将会差异

"""

python高级编程之访问超类中的方法:super()的更多相关文章

  1. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  2. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  3. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  4. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  5. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  6. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  7. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  8. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  9. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

随机推荐

  1. BeyondCompare两个文件中同一行字符长度不一致的文件对比,比如pi文件对比(xjl456852原创)

    假设有两个文件,里面存放的数字都只有一行,但长度不一样,对比时会有问题 示例文件: 对比示例如图: 左边的pi的字符串比较长,右边的比较短. 右边的pi的值不是从开始的第一个位置对比的,这样的情况是有 ...

  2. 关于SetCapture() 和 ReleaseCapture()的使用方法

    查MSND,对SetCapture()函数的说明为:“该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕 ...

  3. Android中Service类onStartCommand

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...

  4. Android调试系列—使用android studio调试smali代码

    1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...

  5. ibatis之##与$$的 使用

    /** 主要讲一下ibatis中$$的使用: 是为了传递参数; 参数一定在Action层用''包裹起来: */ List <SysRole> userList= systemService ...

  6. 网站飘窗js代码

    <SCRIPT> var imagepath="/${res}/images/geren.jpg" ; var imagewidth=178 ;//这两行写图片的大小 ...

  7. js 计算两个日期之间的周数

    //返回两个日期相差的周数 function WeeksBetw(date1, date2) { //这里的date1,date2都是Date对象 var d1 = new Date(date1); ...

  8. chart.js 示例

    一个简单的例子. 1.html代码 <div id="pie" style="width: 250px;float:left"> <h3> ...

  9. struts2 使用jsonplugin

    配置中的参数含义: root参数用于指定要序列化的根对象,如果省去这一配置,表示要序列化action中的所有属性 ignoreHierarchy 为false时表示要序列化根对象的所有基类 exclu ...

  10. [转]shell中 source命令即点空格后面再跟可执行文件的说明

    这里记录的是在一个shell脚本里面使用. ./file.sh 和./file.sh 的区别,本文参考了http://www.lslnet.com/linux/dosc1/39/linux-28353 ...