python高级编程之访问超类中的方法:super()

# -*- 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()

时间: 2024-10-18 22:14:21

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

Python高级编程pdf

下载地址:网盘下载 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和敏捷开发方法,并涉及整个软件生命周期的高级主题,诸如持续集成.版本控制系统.包的发行和分发.开发模式.文档编写等.<Python高级编程>首先介绍如何设置最优的开发环境,然后以Python敏捷开发方法为线索,阐述如何将已被验证的面向对象原则应用到设计中.这些内容为开发人员和项目管理人员提供了整个软件工程中的许多高级概念以及专家级的建议,其中有些内容的意义

python高级编程之超类02:super的缺陷

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #当使用多重继承层次结构时,再使用super的时候是非常危险的,主要是因为类的初始化,基类不在__init__中被隐式调用 #1滥用super和传统调用 #来自james knight(http://funm.net/super-harmful)示例中,类C使用__init__方法调用其基类,这样类B被调用2次 class A(object): def __init

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object #用于所有内建类的公共祖先 #展示一个名为distinctdict类的代码,与平常的dic

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

# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制 在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理 ,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中 urllib2出给

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

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言相关解决识方案,最近最流行的书籍:"""gamma.heim.johson和vlissides a.k.a"四人组(gof)"编写的elements of reusable object-oriented software(中文:<设计模式:可复用面向对

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

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"""它与观察者都有相似的目标,都能在不修改代码的情况下扩展指定的类功能,但是访问者更进一步,它将定义一个负责保存数据类,并将算法推进被称为访问者的其他类中.这种行为和mvc范围(请看:http://en.wikipedia.org/wiki/model-view-controller)相当类似,

python高级编程之最佳实践,描述符与属性01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的问题,必须考虑到几下几点: ~1:应该避免多重继承,可以一些设计模式来代替它 ~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super ~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现 ~4:调

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

python高级编程之迭代器与生成器

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #迭代器与生成器 #--------------------------------------- #迭代器基于2个方法 """ next:返回容器下一个项目 __iter__:返回迭代器本身 """ #通过内建函数和序列来创建 i=iter('abc') print i.next()#a print i.next(